

Amazon Managed Blockchain (AMB) Access Polygon 处于预览版，可能会发生变化。

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

# 亚马逊托管区块链 (AMB) Access Polygon 入门
<a name="getting-started"></a>

使用本节中的信息和程序，开始使用 Amazon Managed Blockchain (AMB) Access Polygon。

**Topics**
+ [创建用于访问 Polygon 区块链网络的 IAM 策略](#getting-started-next-steps)
+ [使用 AMB Access RPC 编辑器发出 Polygon 远程过程调用 (RPC) 请求 AWS 管理控制台](#gs-console-polygon)
+ [使用 AMB Access Polygon JSON-RPC 请求进来 `awscurl` AWS CLI](#awscurl-polygon-rpc-requests)
+ [在 Node.js 中发出 Polygon JSON-RPC 请求](#nodejs-polygon-rpc-requests)

## 创建用于访问 Polygon 区块链网络的 IAM 策略
<a name="getting-started-next-steps"></a>

要访问 Polygon 主网的公共终端节点以进行 JSON-RPC 调用，您必须拥有对亚马逊托管区块链 (AMB`AWS_SECRET_ACCESS_KEY`) Access Polygon 具有相应 IAM 权限的用户证书（`AWS_ACCESS_KEY_ID`和）。在 AWS CLI 安装了的终端中，运行以下命令创建用于访问两个 Polygon 终端节点的 IAM 策略：

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

**注意**  
前面的示例允许您访问所有可用的 Polygon 网络。要访问特定端点，请使用以下`Action`命令：  
`"managedblockchain:InvokeRpcPolygonMainnet"`

创建策略后，将该策略附加到您的 IAM 用户的角色以使其生效。在中 AWS 管理控制台，导航到 IAM 服务，并将策略附加`AmazonManagedBlockchainPolygonAccess`到分配给您的 IAM 用户的角色。

## 使用 AMB Access RPC 编辑器发出 Polygon 远程过程调用 (RPC) 请求 AWS 管理控制台
<a name="gs-console-polygon"></a>

您可以 AWS 管理控制台 使用 AMB Access Polygon 在上编辑、配置和提交远程过程调用 (RPCs)。有了这些 RPCs，您可以在 Polygon 网络上读取数据和写入交易，包括检索数据和向 Polygon 网络提交交易。

**Example**  
以下示例说明如何使用 `eth_getBlockByNumber` RPC 获取有关*最新*区块的信息。将突出显示的变量更改为您自己的输入，或者选择列出的 **RPC 方法**之一，然后输入所需的相关输入。  

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

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

1. 在 “**请求**” 部分中，选择 “`{{POLYGON_MAINNET}}`作为” **{{Blockchain Network}}**。

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

1. 输入**latest**为，**{{Block number}}**然后选择`{{False}}`作为 “**全部交易” 标志**。

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

1. 您可以在 “**响应**” 部分中看到`latest`区块的结果。然后，您可以复制完整的原始交易以供进一步分析或在应用程序的业务逻辑中使用。

有关更多信息，请参阅 [AMB Access Polygon RPCs 支持的](https://docs.aws.amazon.com/managed-blockchain/latest/ambp-dg/polygon-api.html)

## 使用 AMB Access Polygon JSON-RPC 请求进来 `awscurl` AWS CLI
<a name="awscurl-polygon-rpc-requests"></a>

**Example**  
使用签[名版本 4 (Sigv4) 使用您的 IAM 用户证书签署](https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html)请求，以便向 AMB Access Polygon 终端节点发出 Polygon JSON-RPC 请求。[https://github.com/okigan/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 向 Polygon *主网*提交请求。`eth_getBlockByNumber`此调用接受与您要检索其信息的区块号相对应的字符串参数。  
以下命令使用`params`数组中的区块编号来选择要检索标头的特定块，从而从 Polygon 主网检索区块数据。  

```
awscurl -X POST -d '{ "jsonrpc": "2.0", "id": "{{eth_getBlockByNumber-curltest"}}, "method":"{{eth_getBlockByNumber}}", "params":["{{latest}}", {{false}}] }' --service managedblockchain https://{{mainnet}}.polygon.managedblockchain.{{us-east-1}}.amazonaws.com -k
```
您也可以使用令牌`curl`和基于 AMB Access 令牌的访问功能发出同样的请求。`Accessor`有关更多信息，请参阅 [为基于令牌的访问权限创建和管理访问令牌以发出 AMB Access Polygon 请求](polygon-tokens.md)。  

```
curl -X POST -d '{"jsonrpc":"2.0", "id": "{{eth_getBlockByNumber-curltest"}}, "method":"{{eth_getBlockByNumber}}", "params":["{{latest}}", {{false}}] }' 'https://{{mainnet}}.polygon.managedblockchain.{{us-east-1}}.amazonaws.com?billingtoken={{your-billing-token}}'
```
任一命令的响应都会返回有关*最新*区块的信息。出于说明目的，请参见以下示例：  

```
{"error":null,"id":"eth_getBlockByNumber-curltest","jsonrpc":"1.0",
      "result":{"baseFeePerGas":"0x873bf591e","difficulty":"0x18",
      "extraData":"0xd78301000683626f7288676f312e32312e32856c696e757800000000000000009a\
      423a58511085d90eaf15201a612af21ccbf1e9f8350455adaba0d27eff0ecc4133e8cd255888304cc\
      67176a33b451277c2c3c1a6a6482d2ec25ee1573e8ba000",
      "gasLimit":"0x1c9c380","gasUsed":"0x14ca04d",
      "hash":"0x1ee390533a3abc3c8e1306cc1690a1d28d913d27b437c74c761e1a49********;",
      "nonce":"0x0000000000000000","number":"0x2f0ec4d",
      "parentHash":"0x27d47bc2c47a6d329eb8aa62c1353f60e138fb0c596e3e8e9425de163afd6dec",
      "receiptsRoot":"0x394da96025e51cc69bbe3644bc4e1302942c2a6ca6bf0cf241a5724c74c063fd",
      "sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
      "size":"0xbd6b",
      "stateRoot":"0x7ca9363cfe9baf4d1c0dca3159461b2cca8604394e69b30af05d7d5c1beea6c3",
      "timestamp":"0x653ff542",
      "totalDifficulty":"0x33eb01dd","transactions":[...],
      "transactionsRoot":"0xda1602c66ffd746dd470e90a47488114a9d00f600ab598466ecc0f3340b24e0c",
      "uncles":[]}}
```

## 在 Node.js 中发出 Polygon JSON-RPC 请求
<a name="nodejs-polygon-rpc-requests"></a>

你可以使用 HTTPS 提交签名的请求RPCs 来调用 Polygon JSON，使用 [Node.js 中的原生 https 模块](https://nodejs.org/api/https.html)访问 Polygon *主网*网络，也可以使用第三方库，例如 [A](https://axios-http.com) XIOS。[以下 *Node.js* 示例向您展示了如何使用[签名版本 4 (Sigv4](https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html)) 和基于令牌的访问向 AMB Access Polygon 端点发出 Polygon JSON-RPC 请求。](https://docs.aws.amazon.com/managed-blockchain/latest/ambp-dg/polygon-tokens.html)第一个示例将交易从一个地址发送到另一个地址，以下示例从区块链请求交易详情和余额信息。

**Example**  
要运行此示例 Node.js 脚本，请应用以下先决条件：  

1. 您的计算机上必须安装节点版本管理器 (nvm) 和 Node.js。您可以[在此处](https://github.com/nvm-sh/nvm)找到操作系统的安装说明。

1. 使用`node --version`命令并确认您使用的是 *Node 版本 18* 或更高版本。如果需要，您可以使用命令和`nvm install v18.12.0`命令安装*版本 18，即 *LTS* 版本*的 Node。`nvm use v18.12.0`

1. 环境变量`AWS_ACCESS_KEY_ID`和`AWS_SECRET_ACCESS_KEY`必须包含与您的账户关联的证书。

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

   ```
   export AWS_ACCESS_KEY_ID="{{AKIAIOSFODNN7EXAMPLE}}"
   export AWS_SECRET_ACCESS_KEY="{{wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY}}"
   ```
完成所有先决条件后，使用首选的代码编辑器将以下文件复制到本地环境的目录中：  
*package.j*  

```
{
  "name": "polygon-rpc",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "ethers": "^6.8.1",
    "@aws-crypto/sha256-js": "^5.2.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.6.2"
  }
}
```
  
*dispatch-evm-rpc.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 (rpcEndpoint, rpc) => {
 
  // parse the URL into its component parts (e.g. host, path)
  let url = new URL(rpcEndpoint);

  // 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: url,
      data: req.body,
    });
    return response.data;
  } catch (error) {
    console.error("Something went wrong: ", error);
  }
};

module.exports = { rpcRequest: rpcRequest };
```
  
*sendTx.js*  
以下代码使用硬编码私钥生成钱包 Signer，仅`Ethers.js`供演示之用。请勿在生产环境中使用此代码，因为它有真实资金并存在安全风险。  
如有必要，请联系您的客户团队，就钱包和签名者的最佳实践提供建议。
  

```
const ethers = require("ethers");

//set AMB Access Polygon endpoint using token based access (TBA)
let token = "{{your-billing-token}}"
let url = `https://{{mainnet}}.polygon.managedblockchain.{{us-east-1}}.amazonaws.com?billingtoken=${token}`;

//prevent batch RPCs
let options = {
  batchMaxCount: 1,
};

//create JSON RPC provider with AMB Access endpoint and options
let provider = new ethers.JsonRpcProvider(url, null, options);

let sendTx = async (to) => {
  //create an instance of the Wallet class with a private key 
  //DO NOT USE A WALLET YOU USE ON MAINNET, NEVER USE A RAW PRIVATE KEY IN PROD
  let pk = "{{wallet-private-key}}";
  let signer = new ethers.Wallet(pk, provider);

  //use this wallet to send a transaction of POL from one address to another
  const tx = await signer.sendTransaction({
    to: to,
    value: ethers.parseUnits("{{0.0001}}", "{{ether}}"),
  });

  console.log(tx);
};

sendTx("{{recipent-address}}");
```
*readTx.js*  

```
let rpcRequest = require("./dispatch-evm-rpc").rpcRequest;
let ethers = require("ethers");

let getTxDetails = async (txHash) => {
  //set url to a Signature Version 4 endpoint for AMB Access
  let url = "https://{{mainnet}}.polygon.managedblockchain.{{us-east-1}}.amazonaws.com";

  //set RPC request body to get transaction details
  let getTransactionByHash = {
    id: "{{1}}",
    jsonrpc: "2.0",
    method: "{{eth_getTransactionByHash}}",
    params: [{{txHash]}},
  };

  //make RPC request for transaction details
  let txDetails = await rpcRequest(url, getTransactionByHash);
  
  //set RPC request body to get recipient user balance
  let getBalance = {
    id: "2",
    jsonrpc: "2.0",
    method: "{{eth_getBalance}}",
    params: {{[txDetails.result.to, "latest"]}},
  };
    
  //make RPC request for recipient user balance
  let recipientBalance = await rpcRequest(url, {{getBalance}});

  console.log("TX DETAILS: ", txDetails.result, "BALANCE: ", ethers.formatEther(recipientBalance.result));
};

getTxDetails("{{your-transaction-id}}");
```
  
将这些文件保存到您的目录后，使用以下命令安装运行代码所需的依赖项：  

```
npm install
```

### 在 Node.js 中发送交易
<a name="nodejs-send-transaction"></a>

前面的示例通过签署交易并使用 AMB Access Polygon 将其广播到 Polygon 主网，将原生 Polygon 主网令牌 (POL) 从一个地址发送到另一个地址。为此，请使用该脚本，该`sendTx.js`脚本使用一个流行的库`Ethers.js`，用于与以太坊和Polygon等兼容以太坊的区块链进行交互。您需要替换代码中以*红色突出显示*的三个变量，包括`billingToken`用于[基于令牌*访问的 Accessor* 令牌](https://docs.aws.amazon.com/managed-blockchain/latest/ambp-dg/polygon-tokens.html)、用于签署交易的*私钥*以及接收 POL *的收件人地址*。

**提示**  
我们建议您为此目的创建一个新的私钥（钱包），而不是重复使用现有的钱包，以消除资金损失的风险。你可以使用 Ethers 库的钱包类方法 createRandom () 生成一个要测试的钱包。此外，如果您需要从 Polygon 主网申请 POL，则可以使用公共 POL 水龙头申请少量用于测试。

将资金充值钱包的*私钥*和收款人的地址添加到代码中后，您就可以运行以下代码来签署一笔交易，将 *.0001* POL 从您的`billingToken`地址发送到另一个地址，然后使用AMB Access Polygon调用JSON-RPC将其广播到Polygon主网，使用AMB Access Polygon调用 ` eth_sendRawTransaction` JSON-RPC。

```
node sendTx.js
```

收到的回复类似于以下内容：

```
TransactionResponse {
provider: JsonRpcProvider {},
blockNumber: null,
blockHash: null,
index: undefined,
hash: '0x8d7538b4841261c5120c0a4dd66359e8ee189e7d1d34ac646a1d9923********',
type: 2,
to: '0xd2bb4f4f1BdC4CB54f715C249Fc5a991********',
from: '0xcf2C679AC6cb7de09Bf6BB6042ecCF05********',
nonce: 2,
gasLimit: 21000n,
gasPrice: undefined,
maxPriorityFeePerGas: 16569518669n,
maxFeePerGas: 16569518685n,
data: '0x',
value: 100000000000000n,
chainId: 80001n,
signature: Signature {
r: "0x1b90ad9e9e4e005904562d50e904f9db10430a18b45931c059960ede337238ee",
s: "0x7df3c930a964fd07fed4a59f60b4ee896ffc7df4ea41b0facfe82b470db448b7",
yParity: 0,
networkV: null
},
accessList: []
}
```

回复构成交易收据。保存属性的值`hash`。这是您刚刚提交给区块链的交易的标识符。您可以在读取事务示例中使用此属性从 Polygon 主网获取有关此事务的更多详细信息。

请注意`blockNumber`，响应`null`中`blockHash`有 and。这是因为交易尚未记录在 Polygon 网络上的区块中。请注意，这些值是稍后定义的，当您在下一节中请求交易详细信息时，您可能会看到它们。

### 在 Node.js 中读取一笔交易
<a name="nodejs-read-transaction"></a>

在本节中，您将使用AMB Access Polygon向Polygon主网发送的读取请求来请求先前提交的交易的交易详细信息，并使用AMB Access Polygon的读取请求来检索收件人地址的POL余额。在`readTx.js`文件中，替换标{{`your-transaction-id`}}有`hash`您在上一节中运行代码的响应中保存的变量。

[此代码使用一个实用程序`dispatch-evm-rpc.js`，该实用程序使用 AWS 软件开发工具包中必需的[签名版本 4 (Sigv4)](https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html) 模块签署向 AMB Access Polygon 的 HTTPS 请求，并使用广泛使用的 HTTP 客户端 AXIOS 发送请求。](https://axios-http.com)

收到的回复类似于以下内容：

```
TX DETAILS: {
blockHash: '0x59433e0096c783acab0659175460bb3c919545ac14e737d7465b3ddc********',
blockNumber: '0x28b4059',
from: '0xcf2c679ac6cb7de09bf6bb6042eccf05b7fa1394',
gas: '0x5208',
gasPrice: '0x3db9eca5d',
maxPriorityFeePerGas: '0x3db9eca4d',
maxFeePerGas: '0x3db9eca5d',
hash: '0x8d7538b4841261c5120c0a4dd66359e8ee189e7d1d34ac646a1d9923********',
input: '0x',
nonce: '0x2',
to: '0xd2bb4f4f1bdc4cb54f715c249fc5a991********',
transactionIndex: '0x0',
value: '0x5af3107a4000',
type: '0x2',
accessList: [],
chainId: '0x13881',
v: '0x0',
r: '0x1b90ad9e9e4e005904562d50e904f9db10430a18b45931c059960ede337238ee',
s: '0x7df3c930a964fd07fed4a59f60b4ee896ffc7df4ea41b0facfe82b470db448b7'
} BALANCE: 0.0003
```

响应表示交易详情。请注意，现在可能`blockNumber`已经定义了`blockHash`和。这表示交易已记录在区块中。如果这些值仍然存在`null`，请等待几分钟，然后再次运行代码以检查您的交易是否已包含在区块中。最后，使用Ethers的方法将收件人地址余额*（0x110d9316ec000）*的十六进制表示形式转换为十进制，该`formatEther()`方法将十六进制转换为十进制，并将小数位移18位（10^ *18*），以得出POL中的真实余额。

**提示**  
虽然前面的代码示例说明了如何使用 Node.js、Ethers 和 Axios RPCs 在 AMB Access Polygon 上使用一些支持的 JSON，但你可以修改示例并编写其他代码，使用此服务在 Polygon 上构建应用程序。有关 AMB Access Polygon RPCs 上支持的 JSON 的完整列表，请参阅[托管区块链 API 和 JSON-RPCs 支持 AMB Access Polygon](polygon-api.md)。