

Amazon Managed Blockchain (AMB) Access Polygon 處於預覽版本，可能會有所變更。

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

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

使用本節中的資訊和程序，開始使用 Amazon Managed Blockchain (AMB) Access Polygon。

**Topics**
+ [建立 IAM 政策以存取 Polygon 區塊鏈網路](#getting-started-next-steps)
+ [使用 在 AMB Access RPC 編輯器上提出多邊形遠端程序呼叫 (RPC) 請求 AWS 管理主控台](#gs-console-polygon)
+ [`awscurl` 使用 在 中提出 AMB Access Polygon JSON-RPC 請求 AWS CLI](#awscurl-polygon-rpc-requests)
+ [在 Node.js 中提出多邊形 JSON-RPC 請求](#nodejs-polygon-rpc-requests)

## 建立 IAM 政策以存取 Polygon 區塊鏈網路
<a name="getting-started-next-steps"></a>

若要存取 Polygon Mainnet 的公有端點以進行 JSON-RPC 呼叫，您必須擁有具有 Amazon Managed Blockchain (`AWS_ACCESS_KEY_ID`AMB`AWS_SECRET_ACCESS_KEY`) Access Polygon 適當 IAM 許可的使用者登入資料 ( 和 )。在已安裝 AWS CLI 的終端機中，執行下列命令來建立 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
```

**注意**  
上一個範例可讓您存取所有可用的多邊形網路。若要存取特定端點，請使用下列`Action`命令：  
`"managedblockchain:InvokeRpcPolygonMainnet"`

建立政策後，將該政策連接至 IAM 使用者的角色，讓政策生效。在 中 AWS 管理主控台，導覽至 IAM 服務，並將政策連接至指派給 IAM 使用者`AmazonManagedBlockchainPolygonAccess`的角色。

## 使用 在 AMB Access RPC 編輯器上提出多邊形遠端程序呼叫 (RPC) 請求 AWS 管理主控台
<a name="gs-console-polygon"></a>

您可以使用 AWS 管理主控台 AMB Access Polygon 在 上編輯、設定和提交遠端程序呼叫 (RPCs)。透過這些 RPCs，您可以在多邊形網路上讀取資料和寫入交易，包括擷取資料和將交易提交至多邊形網路。

**Example**  
下列範例示範如何使用 `eth_getBlockByNumber` RPC 取得*最新*區塊的相關資訊。將反白顯示的變數變更為您自己的輸入，或選擇列出的其中一個 **RPC 方法**，然後輸入所需的相關輸入。  

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

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

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

1. 選擇 `eth_getBlockByNumber`作為 **RPC 方法**。

1. 輸入 **latest**做為***封鎖號碼***，然後選擇 `False`做為**完整交易旗標**。

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

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

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

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

**Example**  
使用 [Signature 第 4 版 (SigV4)](https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html) 使用您的 IAM 使用者憑證簽署請求，以便對 AMB Access Polygon 端點發出多邊形 JSON-RPC 請求。[https://github.com/okigan/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`，透過叫用 `eth_getBlockByNumber` RPC 向 Polygon *Mainnet* 提交請求。此呼叫接受對應至您要擷取資訊的區塊號碼的字串參數。  
下列命令會使用`params`陣列中的區塊號碼，從 Polygon Mainnet 擷取區塊資料，以選取要擷取標頭的特定區塊。  

```
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 Token `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 中提出多邊形 JSON-RPC 請求
<a name="nodejs-polygon-rpc-requests"></a>

您可以使用 HTTPS 提交簽署的請求，以使用 Node.js 中的原生 https 模組存取 Polygon *Mainnet* 網路，或使用第三方程式庫，例如 [AXIOS](https://axios-http.com)，來叫用 Polygon JSON-RPCs。 [https://nodejs.org/api/https.html](https://nodejs.org/api/https.html)下列 *Node.js* 範例示範如何使用 [Signature 第 4 版 (SigV4) ](https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html)和[字符型存取](https://docs.aws.amazon.com/managed-blockchain/latest/ambp-dg/polygon-tokens.html)，對 AMB Access Polygon 端點提出 Polygon JSON-RPC 請求。第一個範例會將交易從一個地址傳送至另一個地址，而下列範例會從區塊鏈請求交易詳細資訊和平衡資訊。

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

1. 您必須在機器上安裝節點版本管理員 (nvm) 和 Node.js。您可以在[此處](https://github.com/nvm-sh/nvm)找到作業系統的安裝說明。

1. 使用 `node --version`命令並確認您正在使用 *Node 版本 18* 或更新版本。如有需要，您可以使用 `nvm install v18.12.0`命令，後面接著 `nvm use v18.12.0`命令，安裝 Node 的 *LTS* 版本 *18* 版。

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.json*  

```
{
  "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`僅是為了示範。請勿在生產環境中使用此程式碼，因為它具有實際資金並構成安全風險。  
如有需要，請聯絡您的客戶團隊，以提供錢包和 Signer 最佳實務的建議。
  

```
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 Mainnet，將原生 Polygon Mainnet 字符 (POL) 從一個地址傳送至另一個地址。若要這樣做，請使用 指令碼，該`sendTx.js`指令碼使用 `Ethers.js`，這是與多邊形等 Ethereum 和 Ethereum 相容區塊鏈互動的熱門程式庫。您需要在*以紅色反白*的程式碼中取代三個變數，包括`billingToken`用於[字符型存取](https://docs.aws.amazon.com/managed-blockchain/latest/ambp-dg/polygon-tokens.html)*之配件*字符的 、您用來簽署交易的*私有金鑰*，以及接收 POL 的*收件人地址*。

**提示**  
我們建議您為此目的建立新的私有金鑰 （錢包），而不是重複使用現有的錢包，以避免遺失資金的風險。您可以使用 Ethers 程式庫的錢包類別方法 createRandom() 來產生錢包以供測試。此外，如果您需要從 Polygon Mainnet 請求 POL，您可以使用公有 POL 水龍頭請求少量用於測試。

將 `billingToken`、有資金錢包的*私有金鑰*和收件人的地址新增至程式碼後，您可以執行下列程式碼來簽署交易，讓 *.0001* POL 從您的地址傳送到另一個地址，並使用 AMB Access Polygon 將其廣播至 Polygon Mainnet 叫用 ` 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 Mainnet 取得此交易的其他詳細資訊。

請注意， `blockNumber`和 `blockHash`位於回應`null`中。這是因為交易尚未記錄在多邊形網路上的區塊中。請注意，這些值會在稍後定義，當您請求下一節的交易詳細資訊時，您可能會看到這些值。

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

在本節中，您會為先前提交的交易請求交易詳細資訊，並使用 AMB Access Polygon 對 Polygon Mainnet 提出讀取請求，擷取收件人地址的 POL 餘額。在 `readTx.js` 檔案中，使用`hash`您在上一節中執行程式碼的回應中儲存的 *`your-transaction-id`* 取代標記為 的變數。

此程式碼使用公用程式 ，`dispatch-evm-rpc.js`它會使用 AWS SDK 中必要的 [Signature 第 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
```

回應代表交易詳細資訊。請注意，現在可能已定義 `blockHash`和 `blockNumber` 。這表示交易已記錄在區塊中。如果這些值仍然為 `null`，請等待幾分鐘，然後再次執行程式碼，以檢查您的交易是否已包含在區塊中。最後，收件人地址餘額的十六進位表示法 *(0x110d9316ec000)* 會使用 Ethers 的 `formatEther()`方法轉換為十進位，將十六進位轉換為十進位，並將十進位移 *18 (10^18)*，以在 POL 中提供真正的平衡。

**提示**  
雖然上述程式碼範例說明如何使用 Node.js、Ethers 和 Axios 在 AMB Access Polygon 上使用一些支援的 JSON-RPCs，但您可以使用此服務修改範例並撰寫其他程式碼以在 Polygon 上建置應用程式。如需 AMB Access Polygon 上支援 JSON-RPCs 的完整清單，請參閱 [AMB Access Polygon 支援的受管區塊鏈 API 和 JSON-RPCs](polygon-api.md)。