

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# Amazon Managed Blockchain (AMB) Access Bitcoin 入門
<a name="getting-started"></a>

使用本節中的step-by-step教學課程，了解如何使用 Amazon Managed Blockchain (AMB) Access Bitcoin 執行任務。這些範例需要您完成一些先決條件。如果您是初次使用 AMB Access Bitcoin，請檢閱本指南*的設定*一節，確認您已完成這些先決條件。如需詳細資訊，請參閱[設定 Amazon Managed Blockchain (AMB) Access Bitcoin](bitcoin-setting-up.md)。

**Topics**
+ [建立 IAM 政策以存取比特幣 JSON-RPCs](#getting-started-next-steps)
+ [使用 在 AMB Access RPC 編輯器上發出比特幣遠端程序呼叫 (RPC) 請求 AWS 管理主控台](#gs-console-bitcoin)
+ [使用 在 awscurl 中提出 AMB Access Bitcoin JSON-RPC 請求 AWS CLI](#awscurl-bitcoin-rpc-requests)
+ [在 Node.js 中提出比特幣 JSON-RPC 請求](#nodejs-bitcoin-rpc-requests)
+ [透過 使用 AMB Access Bitcoin AWS PrivateLink](#bitcoin-rpc-requests-privatelink)

## 建立 IAM 政策以存取比特幣 JSON-RPCs
<a name="getting-started-next-steps"></a>

若要存取 Bitcoin Mainnet 和 Testnet 的公有端點以進行 JSON-RPC 呼叫，您必須擁有具有 Amazon Managed Blockchain (AMB) Access Bitcoin 適當 IAM 許可的使用者登入資料 (AWS\_ACCESS\_KEY\_ID 和 AWS\_SECRET\_ACCESS\_KEY)。在 AWS CLI 已安裝 的終端機中，執行下列命令來建立 IAM 政策，以存取這兩個 Bitcoin 端點：

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

**注意**  
上述範例可讓您同時存取 Bitcoin Mainnet 和 Testnet。若要存取特定端點，請使用下列`Action`命令：  
`"managedblockchain:InvokeRpcBitcoinMainnet"`
`"managedblockchain:InvokeRpcBitcoinTestnet"`

建立政策後，將該政策連接至 IAM 使用者的角色，讓政策生效。在 中 AWS 管理主控台，導覽至 IAM 服務，並將政策連接至指派給 IAM 使用者`AmazonManagedBlockchainBitcoinAccess`的角色。如需詳細資訊，請參閱[建立角色並指派給 IAM 使用者](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user.html)。

## 使用 在 AMB Access RPC 編輯器上發出比特幣遠端程序呼叫 (RPC) 請求 AWS 管理主控台
<a name="gs-console-bitcoin"></a>

您可以使用 AWS 管理主控台 AMB Access 在 上編輯和提交遠端程序呼叫 (RPCs)。透過這些 RPCs，您可以在比特幣網路上讀取資料、寫入和提交交易。

**Example**  
下列範例顯示如何使用 `blockhash` `getBlock` RPC 取得 *00000000c937983704a73af28acdec37b049d214adbda81d7e2a3dd146f6ed09* 的相關資訊。使用您自己的輸入取代反白顯示的變數，或選擇列出的其他 **RPC 方法**之一，然後輸入所需的相關輸入。  

1. 開啟位於 https：//[https://console.aws.amazon.com/managedblockchain/](https://console.aws.amazon.com/managedblockchain/) 的 Managed Blockchain 主控台。

1. 選擇 **RPC 編輯器**。

1. 在**請求**區段中，選擇 `{{BITCOIN_MAINNET}}`做為**區塊鏈網路**。

1. 選擇 `{{getblock}}`作為 **RPC 方法**。

1. 輸入 `{{00000000c937983704a73af28acdec37b049d214adbda81d7e2a3dd146f6ed09}}`做為**封鎖號碼**，然後選擇 `{{0}}`做為**詳細資訊**。

1. 然後，選擇**提交 RPC**。

1. 您將在此頁面的**回應**區段中取得結果。然後，您可以複製完整的原始交易以進行進一步分析，或在應用程式的商業邏輯中使用 。

如需詳細資訊，請參閱 [AMB Access Bitcoin 支援的 RPCs ](https://docs.aws.amazon.com/managed-blockchain/latest/ambbtc-dg/bitcoin-api.html)

## 使用 在 awscurl 中提出 AMB Access Bitcoin JSON-RPC 請求 AWS CLI
<a name="awscurl-bitcoin-rpc-requests"></a>

**Example**  
使用 [Signature 第 4 版 (SigV4)](https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html) 使用您的 IAM 使用者憑證簽署請求，以便對 AMB Access Bitcoin 端點進行 Bitcoin JSON-RPC 呼叫。[awscurl ](https://github.com/okigan/awscurl) 命令列工具可協助您使用 SigV4 簽署對 AWS 服務的請求。如需詳細資訊，請參閱 [awscurl https：//README.md](https://github.com/okigan/awscurl#readme)。  
使用適用於您作業系統的 方法安裝 awscurl。在 macOS 上，建議使用 HomeBrew 應用程式：  

```
brew install awscurl
```
如果您已安裝並設定 AWS CLI，您的 IAM 使用者登入資料和預設 AWS 區域會在您的環境中設定，並可存取 awscurl。使用 awscurl，透過叫用 `getblock` RPC 向 Bitcoin *Mainnet* 和 *Testnet* 提交請求。此呼叫接受對應至您要擷取資訊的區塊雜湊的字串參數。  
下列命令會使用`params`陣列中的區塊雜湊，從 Bitcoin Mainnet 擷取區塊標頭資料，以選取要擷取標頭的特定區塊。此範例使用 `us-east-1`端點。您可以使用 Amazon Managed Blockchain (AMB) Access Bitcoin 支援的慣用 Bitcoin JSON-RPC 和 AWS 區域來取代此選項。此外，您可以在 命令`testnet `中將 取代`mainnet`為 ，以對 Testnet 網路提出請求，而非 Mainnet。  

```
awscurl -X POST -d '{ "jsonrpc": "1.0", "id": "{{getblockheader-curltest}}", "method": "{{getblockheader}}", "params": ["{{0000000000000000000105bebab2f9dd16234a30950d38ec6ddc24d466e750a0}}"] }' --service managedblockchain https://{{mainnet}}.bitcoin.managedblockchain.{{us-east-1}}.amazonaws.com  --region {{us-east-1}} -k
```
結果包含來自區塊標頭的詳細資訊，以及包含在請求區塊中的交易雜湊清單。請參閱下列範例：  

```
{"result":{"hash":"0000000000000000000105bebab2f9dd16234a30950d38ec6ddc24d466e750a0",
      "confirmations":2,"height":799243,"version":664485888,"versionHex":"279b4000",
      "merkleroot":"568e79752e1921ecf40c961435abb41bc5700fe2833ecadc4abfc2f615ddc1b8",
      "time":1689684290,"mediantime":1689681317,"nonce":2091174943,"bits":"17053894",
      "difficulty":53911173001054.59,
      "chainwork":"00000000000000000000000000000000000000004f375cf72ff64e2404c1589c",
      "nTx":2135,
      "previousblockhash":"00000000000000000002ffe4efe07ae74ec8b92c7696f5e12b5da506f015ba6b",
      "nextblockhash":"000000000000000000038f05ddcf3f483fdcb74f4be606c022bcb673424fa4ca"},
      "error":null,"id":"curltest"}
```

## 在 Node.js 中提出比特幣 JSON-RPC 請求
<a name="nodejs-bitcoin-rpc-requests"></a>

您可以使用 HTTPS 來存取 Bitcoin *Mainnet* 和 *Testnet* 端點，並使用 [ Node.js 中的原生 https 模組進行 JSON-RPC API 呼叫](https://nodejs.org/api/https.html)，或使用第三方程式庫，例如 [AXIOS](https://axios-http.com)。下列範例示範如何對 AMB Access Bitcoin 端點提出 Bitcoin JSON-RPC 請求。

**Example**  
若要執行此範例 Node.js 指令碼，請套用下列先決條件：  

1. 您必須在機器上安裝節點版本管理員 (nvm) 和 Node.js。您可以在[此處](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`必須包含與您 帳戶相關聯的登入資料。環境變數`AMB_HTTP_ENDPOINT`必須包含您的 AMB Access Bitcoin 端點。

   使用下列命令，將這些變數匯出為用戶端上的字串。將下列字串中反白顯示的值取代為 IAM 使用者帳戶的適當值。

   ```
   export AWS_ACCESS_KEY_ID="{{AKIAIOSFODNN7EXAMPLE}}"
   export AWS_SECRET_ACCESS_KEY="{{wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY}}"
   ```
完成所有先決條件後，請使用編輯器將下列`package.json`檔案和`index.js`指令碼複製到您的本機環境：  
*package.json*  

```
{
  "name": "bitcoin-rpc",
  "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"
  }
}
```
*index.js*  

```
const axios = require('axios');
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',
  region: 'us-east-1',
  sha256: SHA256,
});


const rpcRequest = async () => {

  // create a remote procedure call (RPC) request object definig the method, input params
  let rpc = {
    jsonrpc: "1.0", 
    id: "1001", 
    method: 'getblock', 
    params: ["00000000c937983704a73af28acdec37b049d214adbda81d7e2a3dd146f6ed09"]
  }
  
  //bitcoin endpoint
  let bitcoinURL = 'https://mainnet.bitcoin.managedblockchain.us-east-1.amazonaws.com/';
  
  // parse the URL into its component parts (e.g. host, path)
  const url = new URL(bitcoinURL);
  
  // create an HTTP Request object
  const req = new HttpRequest({
    hostname: url.hostname.toString(),
    path: url.pathname.toString(),
    body: JSON.stringify(rpc),
    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: bitcoinURL, data: req.body})

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

 
}

rpcRequest();
```
先前的範例程式碼使用 Axios 向 Bitcoin 端點提出 RPC 請求，並使用官方 AWS SDK v3 工具，以適當的 Signature 第 4 版 (SigV4) 標頭簽署這些請求。若要執行程式碼，請在與 檔案相同的目錄中開啟終端機，並執行下列動作：  

```
npm i
node index.js
```
產生的結果如下：  

```
{"hash":"00000000c937983704a73af28acdec37b049d214adbda81d7e2a3dd146f6ed09","
    confirmations":784126,"height":1000, "version":1,"versionHex":"00000001",
    "merkleroot":"fe28050b93faea61fa88c4c630f0e1f0a1c24d0082dd0e10d369e13212128f33",
    "time":1232346882,
    "mediantime":1232344831,"nonce":2595206198,"bits":"1d00ffff","difficulty":1,
    "chainwork":"000000000000000000000000000000000000000000000000000003e903e903e9",
    "nTx":1,
    "previousblockhash":"0000000008e647742775a230787d66fdf92c46a48c896bfbc85cdc8acc67e87d",
    "nextblockhash":"00000000a2887344f8db859e372e7e4bc26b23b9de340f725afbf2edb265b4c6",
    "strippedsize":216,"size":216,"weight":864,
    "tx":["fe28050b93faea61fa88c4c630f0e1f0a1c24d0082dd0e10d369e13212128f33"]},
    "error":null,"id":"1001"}
```
上一個指令碼中的範例請求會使用與[使用 在 awscurl 中提出 AMB Access Bitcoin JSON-RPC 請求 AWS CLI](#awscurl-bitcoin-rpc-requests)範例相同的輸入參數區塊雜湊來進行`getblock`呼叫。若要進行其他呼叫，請使用不同的比特幣 JSON-RPC 修改指令碼中的`rpc`物件。您可以將主機屬性選項變更為 Bitcoin`testnet`，以在該端點上進行呼叫。

## 透過 使用 AMB Access Bitcoin AWS PrivateLink
<a name="bitcoin-rpc-requests-privatelink"></a>

AWS PrivateLink 是一項高可用性、可擴展的技術，可用來將 VPC 連線至私有 服務，就像在 VPC 中一樣。您不需要使用網際網路閘道、NAT 裝置、公有 IP 地址、 AWS Direct Connect 連線或 AWS Site-to-Site VPN 連線，即可從私有子網路與服務通訊。如需 AWS PrivateLink 或 設定的詳細資訊 AWS PrivateLink，請參閱[什麼是 AWS PrivateLink？](https://docs.aws.amazon.com/vpc/latest/privatelink/what-is-privatelink.html)

您可以使用 VPC 端點 AWS PrivateLink 將 Bitcoin JSON-RPC 請求傳送到 AMB Access Bitcoin。對此私有端點的請求不會透過開放網際網路傳遞，因此您可以使用相同的 *SigV4* 身分驗證，直接將請求傳送至 Bitcoin 端點。如需詳細資訊，請參閱[透過 存取 AWS 服務 AWS PrivateLink](https://docs.aws.amazon.com/vpc/latest/privatelink/privatelink-access-aws-services.html)。

對於*服務名稱*，請在*AWS 服務*欄中尋找 *Amazon Managed Blockchain*。如需詳細資訊，請參閱 [AWS 整合的 服務 AWS PrivateLink](https://docs.aws.amazon.com/vpc/latest/privatelink/aws-services-privatelink-support.html)。端點的服務名稱將採用下列格式：`com.amazonaws.{{AWS-REGION}}.managedblockchain.bitcoin.{{NETWORK-TYPE}}`。

 例如：`com.amazonaws.{{us-east-1}}.managedblockchain.bitcoin.{{testnet}}`。