

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Amazon Managed Blockchain (AMB) クエリの開始方法
<a name="getting-started"></a>

Amazon Managed Blockchain (AMB) クエリを使用してタスクを実行する方法については、このセクションのstep-by-stepのチュートリアルを参照してください。これらの手順には、いくつかの前提条件が必要です。AMB クエリを初めて使用する場合は、このガイドの*「セットアップ*」セクションを参照してください。詳細については、「[Amazon Managed Blockchain (AMB) クエリの設定](ambq-setting-up.md)」を参照してください。

**注記**  
これらの例の一部の変数は意図的に難読化されています。これらの例を実行する前に、有効なものに置き換えてください。

**Topics**
+ [AMB クエリ API オペレーションにアクセスするための IAM ポリシーを作成する](#getting-started-iam-policy)
+ [Go を使用して Amazon Managed Blockchain (AMB) クエリ API リクエストを作成する](#getting-started-go-example)
+ [Node.js を使用して Amazon Managed Blockchain (AMB) クエリ API リクエストを作成する](#node-amb-query-requests)
+ [Python を使用して Amazon Managed Blockchain (AMB) クエリ API リクエストを作成する](#python-amb-query-requests)
+ [で Amazon Managed Blockchain (AMB) クエリ AWS マネジメントコンソール を使用して GetTokenBalance オペレーションを実行する](#query-console-gettokenbalance-example)

## AMB クエリ API オペレーションにアクセスするための IAM ポリシーを作成する
<a name="getting-started-iam-policy"></a>

AMB クエリ API リクエストを行うには、Amazon Managed Blockchain (AMB) クエリの適切な IAM アクセス許可を持つユーザー認証情報 (AWS\$1ACCESS\$1KEY\$1ID および AWS\$1SECRET\$1ACCESS\$1KEY) を使用する必要があります。 AWS CLI がインストールされているターミナルで、次のコマンドを実行して IAM ポリシーを作成し、AMB クエリ API オペレーションにアクセスします。

```
cat <<EOT > ~/amb-query-access-policy.json
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid" : "AMBQueryAccessPolicy",
            "Effect": "Allow",
            "Action": [
                "managedblockchain-query:*"
            ],
            "Resource": "*"
        }
    ]
}
EOT
aws iam create-policy --policy-name AmazonManagedBlockchainQueryAccess --policy-document file://$HOME/amb-query-access-policy.json
```

ポリシーを作成したら、そのポリシーを IAM ユーザーのロールにアタッチして有効にします。で AWS マネジメントコンソール、IAM サービスに移動し、サービスを使用する IAM ユーザーに割り当てられた`AmazonManagedBlockchainQueryAccess`ロールにポリシーをアタッチします。詳細については、[「ロールの作成」および「IAM ユーザーへの割り当て](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user.html)」を参照してください。

**注記**  
AWS では、ワイルドカード を使用するのではなく、特定の API オペレーションへのアクセスを許可することをお勧めします`*`。詳細については、「[特定の Amazon Managed Blockchain (AMB) クエリ API アクションへのアクセス](security_iam_id-based-policy-examples.md#security_iam_id-based-policy-examples-access-ambquery-apis)」を参照してください。

## Go を使用して Amazon Managed Blockchain (AMB) クエリ API リクエストを作成する
<a name="getting-started-go-example"></a>

Amazon Managed Blockchain (AMB) クエリを使用すると、ブロックチェーンで確認されると、*ブロック*チェーンデータへの即時アクセスに依存するアプリケーションを構築できます。AMB クエリを使用すると、ウォレットのトランザクション履歴の入力、トランザクションハッシュに基づくトランザクションに関するコンテキスト情報の提供、ネイティブトークンと ERC-721, ERC-1155ERC-20 トークンのバランスの取得など、いくつかのユースケースが可能になります。

次の例は、Go 言語で作成され、AMB クエリ API オペレーションを使用します。Go の詳細については、[「Go ドキュメント](https://go.dev/doc/)」を参照してください。AMB クエリ API の詳細については、[「Amazon Managed Blockchain (AMB) クエリ API リファレンスドキュメント](https://docs.aws.amazon.com/managed-blockchain/latest/AMBQ-APIReference/API_Operations.html)」を参照してください。

次の例では、 `ListTransactions`および `GetTransaction` API アクションを使用して、Ethereum Mainnet 上の特定の外部所有アドレス (EOA) のすべてのトランザクションのリストを取得し、次の例では、リストから 1 つのトランザクションのトランザクション詳細を取得します。

**Example — Go を使用して `ListTransactions` API アクションを実行する**  
次のコードを *ListTransactions* ディレクトリ`listTransactions.go`の という名前のファイルにコピーします。  

```
package main

import (
    "fmt"
    "github.com/aws/aws-sdk-go/aws"
    "github.com/aws/aws-sdk-go/aws/session"
    "github.com/aws/aws-sdk-go/service/managedblockchainquery"
    "time"
)

func main() {

    // Set up a session
    ambQuerySession := session.Must(session.NewSessionWithOptions(session.Options{
        Config: aws.Config{
            Region: aws.String("us-east-1"),
        },
    }))
    client := managedblockchainquery.New(ambQuerySession)

    // Inputs for ListTransactions API
    ownerAddress := "0x00000bf26964af9d7eed9e03e53415d********"
    network := managedblockchainquery.QueryNetworkEthereumMainnet
    sortOrder := managedblockchainquery.SortOrderAscending
    fromTime := time.Date(1971, 1, 1, 1, 1, 1, 1, time.UTC)
    toTime := time.Now()
    nonFinal := "NONFINAL"
    // Call ListTransactions API. Transactions that have reached finality are always returned
    listTransactionRequest, listTransactionResponse := client.ListTransactionsRequest(&managedblockchainquery.ListTransactionsInput{
        Address: &ownerAddress,
        Network: &network,
        Sort: &managedblockchainquery.ListTransactionsSort{
            SortOrder: &sortOrder,
        },
        FromBlockchainInstant: &managedblockchainquery.BlockchainInstant{
            Time: &fromTime,
        },
        ToBlockchainInstant: &managedblockchainquery.BlockchainInstant{
            Time: &toTime,
        },
        
        ConfirmationStatusFilter: &managedblockchainquery.ConfirmationStatusFilter{
            Include: []*string{&nonFinal},
          },
    })
    errors := listTransactionRequest.Send()

    if errors == nil {
        // handle API response
        fmt.Println(listTransactionResponse)
    } else {
        // handle API errors
        fmt.Println(errors)
    }
}
```

ファイルを保存したら、*ListTransactions* ディレクトリ内の コマンド を使用してコードを実行します`go run listTransactions.go`。

次の出力は次のようになります。

```
{
  Transactions: [
    {
      ConfirmationStatus: "FINAL",
      Network: "ETHEREUM_MAINNET",
      TransactionHash: "0x12345ea404b45323c0cf458ac755ecc45985fbf2b18e2996af3c8e8693354321",
      TransactionTimestamp: 2020-06-01 01:59:11 +0000 UTC
    },
    {
      ConfirmationStatus: "FINAL",
      Network: "ETHEREUM_MAINNET",
      TransactionHash: "0x1234547c65675d867ebd2935bb7ebe0996e9ec8e432a579a4516c7113bf54321",
      TransactionTimestamp: 2021-09-01 20:06:59 +0000 UTC
    },
     {
      ConfirmationStatus: "NONFINAL",
      Network: "ETHEREUM_MAINNET",
      TransactionHash: "0x123459df7c1cd42336cd1c444cae0eb660ccf13ef3a159f05061232a24954321",
      TransactionTimestamp: 2024-01-23 17:10:11 +0000 UTC
    }
  ]
}
```

**Example — Go を使用して `GetTransaction` API アクションを実行する**  
この例では、前の出力のトランザクションハッシュを使用します。次のコードを *GetTransaction* ディレクトリ`GetTransaction.go`の という名前のファイルにコピーします。  

```
package main

import (
    "fmt"
    "github.com/aws/aws-sdk-go/aws"
    "github.com/aws/aws-sdk-go/aws/session"
    "github.com/aws/aws-sdk-go/service/managedblockchainquery"
)

func main() {

    // Set up a session
    ambQuerySession := session.Must(session.NewSessionWithOptions(session.Options{
        Config: aws.Config{
            Region: aws.String("us-east-1"),
        },
    }))
    client := managedblockchainquery.New(ambQuerySession)

    // inputs for GetTransaction API
    transactionHash := "0x123452695a82868950d9db8f64dfb2f6f0ad79284a6c461d115ede8930754321"
    network := managedblockchainquery.QueryNetworkEthereumMainnet

    // Call GetTransaction API. This operation will return transaction details for all 
    // transactions that are conﬁrmed on the blockchain, even if they have not 
    // reached ﬁnality.
    getTransactionRequest, getTransactionResponse := client.GetTransactionRequest(&managedblockchainquery.GetTransactionInput{
        Network:         &network,
        TransactionHash: &transactionHash,
    })

    errors := getTransactionRequest.Send()
    if errors == nil {
        // handle API response
        fmt.Println(getTransactionResponse)
    } else {
        // handle API errors
        fmt.Println(errors)
    }
}
```
ファイルを保存したら、*GetTransaction* ディレクトリ内の次のコマンド を使用してコードを実行します`go run GetTransaction.go`。  
次の出力は次のようになります。  

```
{
  Transaction: {
    BlockHash: "0x000005c6a71d1afbc005a652b6ceca71cd516d97b0fc514c2a1d0f2ca3912345",
    BlockNumber: "11111111",
    CumulativeGasUsed: "5555555",
    EffectiveGasPrice: "44444444444",
    From: "0x9157f4de39ab4c657ad22b9f19997536********",
    GasUsed: "22222",
    Network: "ETHEREUM_MAINNET",
    NumberOfTransactions: 111,
    SignatureR: "0x99999894fd2df2d039b3555dab80df66753f84be475069dfaf6c6103********",
    SignatureS: "0x77777a101e7f37dd2dd0bf878b39080d5ecf3bf082c9bd4f40de783e********",
    SignatureV: 0,
    ConfirmationStatus: "FINAL", 
    ExecutionStatus: "SUCCEEDED", 
    To: "0x5555564f282bf135d62168c1e513280d********",
    TransactionHash: "0x123452695a82868950d9db8f64dfb2f6f0ad79284a6c461d115ede8930754321",
    TransactionIndex: 11,
    TransactionTimestamp: 2022-02-02 01:01:59 +0000 UTC
  }
}
```

`GetTokenBalance` API は、ある時点で外部所有アカウント (EOA) の現在の残高を取得するために使用できるネイティブトークン (ETH と BTC) の残高を取得する方法を提供します。

**Example — `GetTokenBalance` API アクションを使用して Go でネイティブトークンのバランスを取得します。**  
次の例では、 `GetTokenBalance` API を使用して Ethereum Mainnet のアドレス Ether (ETH) 残高を取得します。次のコードを *GetTokenBalance* ディレクトリ`GetTokenBalanceEth.go`の という名前のファイルにコピーします。  

```
package main

import (
    "fmt"
    "github.com/aws/aws-sdk-go/aws"
    "github.com/aws/aws-sdk-go/aws/session"
    "github.com/aws/aws-sdk-go/service/managedblockchainquery"
)

func main() {
    // Set up a session
    ambQuerySession := session.Must(session.NewSessionWithOptions(session.Options{
        Config: aws.Config{
            Region: aws.String("us-east-1"),
        },
    }))
    client := managedblockchainquery.New(ambQuerySession)

    // inputs for GetTokenBalance API
    ownerAddress := "0xBeE510AF9804F3B459C0419826b6f225********"
    network := managedblockchainquery.QueryNetworkEthereumMainnet
    nativeTokenId  := "eth" //Ether on Ethereum mainnet

    // call GetTokenBalance API
    getTokenBalanceRequest, getTokenBalanceResponse := client.GetTokenBalanceRequest(&managedblockchainquery.GetTokenBalanceInput{
        TokenIdentifier: &managedblockchainquery.TokenIdentifier{
            Network:         &network,
            TokenId: &nativeTokenId,
        },
        OwnerIdentifier: &managedblockchainquery.OwnerIdentifier{
            Address: &ownerAddress,
        },
    })
    errors := getTokenBalanceRequest.Send()

    if errors == nil {
        // process API response
        fmt.Println(getTokenBalanceResponse)
    } else {
        // process API errors
        fmt.Println(errors)
    }
}
```
ファイルを保存したら、*GetTokenBalance* ディレクトリ内の次のコマンド を使用してコードを実行します`go run GetTokenBalanceEth.go`。  
次の出力は次のようになります。  

```
{
  AtBlockchainInstant: {
    Time: 2020-12-05 11:51:01 +0000 UTC
  },
  Balance: "4343260710",
  LastTransactionHash: "0x00000ce94398e56641888f94a7d586d51664eb9271bf2b3c48297a50a0711111",
  LastTransactionTime: 2023-03-14 18:33:59 +0000 UTC,
  OwnerIdentifier: {
    Address: "0x12345d31750D727E6A3a7B534255BADd********"
  },
  TokenIdentifier: {
    Network: "ETHEREUM_MAINNET",
    TokenId: "eth"
  }
}
```

## Node.js を使用して Amazon Managed Blockchain (AMB) クエリ API リクエストを作成する
<a name="node-amb-query-requests"></a>

これらのノード例を実行するには、次の前提条件が適用されます。

1. マシンにはノードバージョンマネージャー (nvm) と Node.js がインストールされている必要があります。OS のインストール手順については、[こちらを参照してください](https://github.com/nvm-sh/nvm)。

1. `node --version` コマンドを使用して、*Node バージョン 14 *以降を使用していることを確認します。必要に応じて、 `nvm install 14` コマンドを使用し、続いて `nvm use 14` コマンドを使用して*バージョン 14 *をインストールできます。

1. 環境変数 `AWS_ACCESS_KEY_ID`と には、アカウントに関連付けられている認証情報が含まれている`AWS_SECRET_ACCESS_KEY`必要があります。

   次のコマンドを使用して、これらの変数をクライアントの文字列としてエクスポートします。以下の強調表示された値を IAM ユーザーアカウントの適切な値に置き換えます。

   ```
   export AWS_ACCESS_KEY_ID="AKIAIOSFODNN7EXAMPLE"
   export AWS_SECRET_ACCESS_KEY="wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"
   ```

**注記**  
すべての前提条件を完了したら、HTTPS 経由で署名付きリクエストを送信して Amazon Managed Blockchain (AMB) クエリ API オペレーションにアクセスし、[Node.js のネイティブ https モジュール](https://nodejs.org/api/https.html)を使用してリクエストを行うか、[AXIOS](https://www.npmjs.com/package/axios) などのサードパーティーライブラリを使用して AMB クエリからデータを取得できます。
これらの例では Node.js にサードパーティーの HTTP クライアントを使用していますが、 AWS JavaScript SDK を使用して AMB クエリにリクエストを行うこともできます。
次の例は、Axios と AWS SigV4 用の SDK モジュールを使用して AMB クエリ API リクエストを行う方法を示しています。

次の`package.json`ファイルをローカル環境の作業ディレクトリにコピーします。

```
{
  "name": "amb-query-examples",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "@aws-crypto/sha256-js": "^4.0.0",
    "@aws-sdk/credential-provider-node": "^3.360.0",
    "@aws-sdk/protocol-http": "^3.357.0",
    "@aws-sdk/signature-v4": "^3.357.0",
    "axios": "^1.4.0"
  }
}
```

**Example — AMB クエリ `GetTokenBalance` API を使用して、特定の外部所有アドレス (EOA) から過去のトークン残高を取得する**  
`GetTokenBalance` API を使用して、さまざまなトークン (ERC20, ERC721、ERC1155 など) とネイティブコイン (ETH、BTC など) のバランスを取得できます。これを使用して、履歴 `timestamp` (Unix タイムスタンプ - 秒) に基づいて外部所有アカウント (EOA) の現在のバランスを取得できます。この例では、 [https://docs.aws.amazon.com/managed-blockchain/latest/AMBQ-APIReference/GetTokenBalance.html](https://docs.aws.amazon.com/managed-blockchain/latest/AMBQ-APIReference/GetTokenBalance.html) API を使用して、Ethereum Mainnet の ERC20 トークン USDC のアドレスバランスを取得します。  
`GetTokenBalance` API をテストするには、次のコードを という名前のファイルにコピーし`token-balance.js`、そのファイルを同じ作業ディレクトリに保存します。  

```
const axios = require('axios').default;
const SHA256 = require('@aws-crypto/sha256-js').Sha256
const defaultProvider = require('@aws-sdk/credential-provider-node').defaultProvider
const HttpRequest = require('@aws-sdk/protocol-http').HttpRequest
const SignatureV4 = require('@aws-sdk/signature-v4').SignatureV4

// define a signer object with AWS service name, credentials, and region
const signer = new SignatureV4({
  credentials: defaultProvider(),
  service: 'managedblockchain-query',
  region: 'us-east-1',
  sha256: SHA256,
});

const queryRequest = async (path, data) => {
  //query endpoint
  let queryEndpoint = `https://managedblockchain-query.us-east-1.amazonaws.com/${path}`;
  
  // parse the URL into its component parts (e.g. host, path)
  const url = new URL(queryEndpoint);
  
  // create an HTTP Request object
  const req = new HttpRequest({
    hostname: url.hostname.toString(),
    path: url.pathname.toString(),
    body: JSON.stringify(data),
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'Accept-Encoding': 'gzip',
      host: url.hostname,
    }
  });

  
  // use AWS SignatureV4 utility to sign the request, extract headers and body
  const signedRequest = await signer.sign(req, { signingDate: new Date() });
  
  try {
    //make the request using axios
    const response = await axios({...signedRequest, url: queryEndpoint, data: data})

    console.log(response.data)
  } catch (error) {
    console.error('Something went wrong: ', error)
    throw error
  } 

 
}


let methodArg = 'get-token-balance';

let dataArg = {
  " atBlockchainInstant": {
    "time": 1688071493
  },  
  "ownerIdentifier": {
      "address": "0xf3B0073E3a7F747C7A38B36B805247B2********" // externally owned address
  },
  "tokenIdentifier": {
      "contractAddress":"0xA0b86991c6218b36c1d19D4a2e9Eb0cE********", //USDC contract address 
      "network":"ETHEREUM_MAINNET"
  }
}

//Run the query request.
queryRequest(methodArg, dataArg);
```
コードを実行するには、ファイルと同じディレクトリでターミナルを開き、次のコマンドを実行します。  

```
npm i
node token-balance.js
```
 このコマンドはスクリプトを実行し、コードで定義された引数を渡して、Ethereum Mainnet にリストされている EOA の ERC20 USDC 残高をリクエストします。応答は次の例のようになります。  

```
 {
  atBlockchainInstant: { time: 1688076218 },
  balance: '140386693440144',
  lastUpdatedTime: { time: 1688074727 },
  ownerIdentifier: { address: '0xf3b0073e3a7f747c7a38b36b805247b2********' },
  tokenIdentifier: {
    contractAddress: '0xa0b86991c6218b36c1d19d4a2e9eb0ce********',
    network: 'ETHEREUM_MAINNET'
  }
```

## Python を使用して Amazon Managed Blockchain (AMB) クエリ API リクエストを作成する
<a name="python-amb-query-requests"></a>

これらの Python の例を実行するには、次の前提条件が適用されます。

1. マシンに Python がインストールされている必要があります。OS のインストール手順については、[こちらを参照してください](https://wiki.python.org/moin/BeginnersGuide/Download)。

1. [AWS SDK for Python (Boto3) ](https://aws.amazon.com/sdk-for-python/)をインストールします。

1. [AWS コマンドラインインターフェイス](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)をインストールし、 コマンドを実行して、`Access Key ID`、、`Secret Access Key`および の変数`aws configure`を設定します`Region`。

すべての前提条件を完了したら、SDK for Python over HTTPS を使用して AWS Amazon Managed Blockchain (AMB) クエリ API リクエストを行うことができます。

次の Python の例では、boto3 のモジュールを使用して、必要な SigV4 ヘッダーがアタッチされたリクエストを AMB クエリ `ListTransactionEvents` API オペレーションに送信します。この例では、Ethereum Mainnet 上の特定のトランザクションによって出力されるイベントのリストを取得します。

次の`list-transaction-events.py`ファイルをローカル環境の作業ディレクトリにコピーします。

```
import json
from botocore.auth import SigV4Auth
from botocore.awsrequest import AWSRequest
from botocore.session import Session
from botocore.httpsession import URLLib3Session

def signed_request(url, method,  params, service, region):

    session = Session()
    sigv4 = SigV4Auth(session.get_credentials(), service, region)
    data = json.dumps(params)
    request = AWSRequest(method, url, data=data)
    sigv4.add_auth(request)
    http_session = URLLib3Session()
    response = http_session.send(request.prepare())

    return(response)

url = 'https://managedblockchain-query.us-east-1.amazonaws.com/list-transaction-events'
method = 'POST'
params = {
'network': 'ETHEREUM_MAINNET', 
'transactionHash': '0x125714bb4db48757007fff2671b37637bbfd6d47b3a4757ebbd0c5222984f905'
}
service = 'managedblockchain-query'
region = 'us-east-1'

# Call the listTransactionEvents operation. This operation will return transaction details for 
# all transactions that are conﬁrmed on the blockchain, even if they have not reached 
# ﬁnality.
listTransactionEvents = signed_request(url, method, params, service, region)

print(json.loads(listTransactionEvents.content.decode('utf-8')))
```

サンプルコードを に実行するには`ListTransactionEvents`、ファイルを作業ディレクトリに保存し、コマンド を実行します`python3 list-transaction-events.py`。このコマンドはスクリプトを実行し、コードで定義された引数を渡して、Ethereum Mainnet で指定されたトランザクションハッシュに関連付けられたイベントをリクエストします。応答は次の例のようになります。

```
{
 'events': 
 [
  {
      'contractAddress': '0x95ad61b0a150d79219dcf64e1e6cc01f********',
      'eventType': 'ERC20_TRANSFER',
      'from': '0xab5801a7d398351b8be11c439e05c5b3********',
      'network': 'ETHEREUM_MAINNET',
      'to': '0xdead0000000000000000420694206942********',
      'transactionHash': '0x125714bb4db48757007fff2671b37637bbfd6d47b3a4757ebbd0c522********',
      'value': '410241996771871894771826174755464'
  }
 ]
}
```

## で Amazon Managed Blockchain (AMB) クエリ AWS マネジメントコンソール を使用して GetTokenBalance オペレーションを実行する
<a name="query-console-gettokenbalance-example"></a>

次の例は、 の Amazon Managed Blockchain (AMB) クエリを使用して *Ethereum Mainnet* でトークンの残高を取得する方法を示しています。 AWS マネジメントコンソール

**Example**  

1. [https://console.aws.amazon.com/managedblockchain/](https://console.aws.amazon.com/managedblockchain/) で Amazon Managed Blockchain コンソールを開きます。

1. **クエリセクションからクエリエディタ**を選択します。 ** **

1. **ブロックチェーンネットワーク**として **ETHEREUM\$1MAINNET** を選択します。

1. **クエリタイプ**として **GetTokenBalance** を選択します。

1. トークンの**ブロックチェーンアドレス**を入力します。

1. トークンの**契約アドレス**を入力します。

1. トークンのオプションの**トークン ID** を入力します。

1. トークン残高**の日付**を選択します。

1. トークン残高のオプションの **At time** を入力します。

1. **[Run query]** (クエリの実行) を選択します。
AMB クエリはクエリを実行し、**クエリ結果**ウィンドウに結果が表示されます。