

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 开始使用亚马逊托管区块链 (AMB) 访问比特币
<a name="getting-started"></a>

使用本节中的 step-by-step教程来学习如何使用亚马逊托管区块链 (AMB) Access Bitcoin 来执行任务。这些示例要求您完成一些先决条件。如果您不熟悉 AMB Access Bitcoin，请查看本指南的*设置*部分，确保您已完成这些先决条件。有关更多信息，请参阅 [设置亚马逊托管区块链 (AMB) 访问比特币](bitcoin-setting-up.md)。

**Topics**
+ [创建一个 IAM 策略来访问比特币 JSON-RPCs](#getting-started-next-steps)
+ [使用 AMB Access RPC 编辑器发出比特币远程过程调用 (RPC) 请求 AWS 管理控制台](#gs-console-bitcoin)
+ [使用 awscurl 发出 AMB 访问比特币 JSON-RPC 请求 AWS CLI](#awscurl-bitcoin-rpc-requests)
+ [在 Node.js 中发出比特币 JSON-RPC 请求](#nodejs-bitcoin-rpc-requests)
+ [使用 AMB 访问比特币 AWS PrivateLink](#bitcoin-rpc-requests-privatelink)

## 创建一个 IAM 策略来访问比特币 JSON-RPCs
<a name="getting-started-next-steps"></a>

要访问比特币主网和测试网的公共端点以进行 JSON-RPC 调用，您必须拥有拥有相应的 IAM 权限的用户证书（AWS\_ACCESS\_KEY\_ID 和 AWS\_SECRET \_ACCESS\_KEY），才能访问比特币。在 AWS CLI 安装了的终端中，运行以下命令创建用于访问两个比特币终端节点的 IAM 策略：

```
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
```

**注意**  
前面的示例允许您同时访问比特币主网和测试网。要访问特定端点，请使用以下`Action`命令：  
`"managedblockchain:InvokeRpcBitcoinMainnet"`
`"managedblockchain:InvokeRpcBitcoinTestnet"`

创建策略后，将该策略附加到您的 IAM 用户的角色以使其生效。在中 AWS 管理控制台，导航到 IAM 服务，并将策略附加`AmazonManagedBlockchainBitcoinAccess`到分配给您的 IAM 用户的角色。有关更多信息，请参阅[创建角色并分配给 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**  
以下示例显示了如何使用 RPC 获取有关 *00000000c983704a73af28acdec37b049d214adbda81d7e2a3dd14a3dd146f6ed09* `blockhash` 的信息。`getBlock`用您自己的输入替换突出显示的变量，或者选择列出的其他 **RPC 方法**之一，然后输入所需的相关输入。  

1. 打开托管区块链控制台，网址为[https://console.aws.amazon.com/managedblockchain/](https://console.aws.amazon.com/managedblockchain/)。

1. 选择 **RPC 编辑器**。

1. 在**请求**部分中，选择`{{BITCOIN_MAINNET}}`作为**区块链网络**。

1. 选择`{{getblock}}`作为 **RPC 方法**。

1. 输入`{{00000000c937983704a73af28acdec37b049d214adbda81d7e2a3dd146f6ed09}}`作为**区块号**并选择`{{0}}`作为**详细程度**。

1. 然后，选择**提交 RPC**。

1. 您将在本页的 “**回复**” 部分获得结果。然后，您可以复制完整的原始交易以供进一步分析或用于应用程序的业务逻辑。

欲了解更多信息，请参阅 [AMB Access 比特币RPCs 支持的](https://docs.aws.amazon.com/managed-blockchain/latest/ambbtc-dg/bitcoin-api.html)

## 使用 awscurl 发出 AMB 访问比特币 JSON-RPC 请求 AWS CLI
<a name="awscurl-bitcoin-rpc-requests"></a>

**Example**  
使用[签名版本 4 (Sigv4) 使用您的 IAM 用户证书签署](https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html)请求，以便向 AMB Access 比特币端点进行比特币 JSON-RPC 调用。[awscurl](https://github.com/okigan/awscurl) 命令行工具可以帮助您使用 Sigv4 签署对 AWS 服务的请求。有关更多信息，请参阅 [awscur](https://github.com/okigan/awscurl#readme) l README.md。  
使用适合您的操作系统的方法安装 awscurl。在 macOS 上，推荐 HomeBrew使用以下应用程序：  

```
brew install awscurl
```
如果您已经安装并配置了 AWS CLI，则您的 IAM 用户证书和默认 AWS 区域将在您的环境中设置并可以访问 awscurl。使用 awscurl，通过调用 RPC 向比特币*主网和*测试网**提交请求。`getblock`此调用接受与您要检索其信息的区块哈希相对应的字符串参数。  
以下命令使用`params`数组中的区块哈希来选择要检索标头的特定区块，从而从比特币主网上检索区块头数据。此示例使用`us-east-1`终端节点。你可以将其替换为你首选的比特币 JSON-RPC 和受亚马逊托管区块链 (AMB) 访问比特币支持的 AWS 区域。此外，您可以通过在命令中替换`mainnet`为，向测试网网络而不是主网发出请求。`testnet `  

```
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 提交签名的请求来访问比特币*主网和*测试网**端点，并使用 [Node.js 中的原生 https 模块](https://nodejs.org/api/https.html)进行 JSON-RPC API 调用，也可以使用第三方库，例如 AXIOS。](https://axios-http.com)以下示例向您展示了如何向 AMB Access 比特币端点发出比特币 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 比特币端点。

   使用以下命令将这些变量作为字符串导出到客户端。将以下字符串中突出显示的值替换为您的 IAM 用户账户中的相应值。

   ```
   export AWS_ACCESS_KEY_ID="{{AKIAIOSFODNN7EXAMPLE}}"
   export AWS_SECRET_ACCESS_KEY="{{wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY}}"
   ```
完成所有先决条件后，使用编辑器将以下`package.json`文件和`index.js`脚本复制到本地环境中：  
*包裹.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 向比特币端点发出 RPC 请求，并使用官方的 SDK v3 工具，使用相应的签名版本 4 (Sigv4) 标头对这些请求进行签名。 AWS 要运行代码，请在文件所在目录下打开终端，然后运行以下命令：  

```
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 访问比特币 JSON-RPC 请求 AWS CLI](#awscurl-bitcoin-rpc-requests)示例相同的输入参数区块哈希进行`getblock`调用。要进行其他调用，请使用不同的比特币 JSON-RPC 修改脚本中的`rpc`对象。您可以将主机属性选项更改为比特币，`testnet`以便在该端点上拨打电话。

## 使用 AMB 访问比特币 AWS PrivateLink
<a name="bitcoin-rpc-requests-privatelink"></a>

AWS PrivateLink 是一种高度可用、可扩展的技术，您可以使用它来私下连接您的 VPC 和服务，就像这些服务位于您的 VPC 中一样。您不必使用互联网网关、NAT 设备、公有 IP 地址、 AWS Direct Connect 连接或 AWS 站点到站点 VPN 连接即可从您的私有子网与服务通信。有关 AWS PrivateLink 或要设置的更多信息 AWS PrivateLink，请参阅[什么是 AWS PrivateLink？](https://docs.aws.amazon.com/vpc/latest/privatelink/what-is-privatelink.html)

您可以 AWS PrivateLink 使用 VPC 终端节点向 AMB Access Bitcoin 发送比特币 JSON-RPC 请求。对该私有端点的请求不会通过开放的互联网传递，因此您可以使用相同的 *SigV4* 身份验证将请求直接发送到比特币端点。有关更多信息，请参阅[通过访问 AWS 服务 AWS PrivateLink](https://docs.aws.amazon.com/vpc/latest/privatelink/privatelink-access-aws-services.html)。

要查看*服务名称，请在*AWS 服务**栏中查找 *Amazon Managed Blockch* ain。有关更多信息，请参阅[与集成的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}}`。