

Amazon Managed Blockchain(AMB) Access Polygon은 평가판 릴리스이며 변경될 수 있습니다.

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# Amazon Managed Blockchain(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 Management Console](#gs-console-polygon)
+ [를 `awscurl` 사용하여에서 AMB Access Polygon JSON-RPC 요청 수행 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 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
```

**참고**  
이전 예제에서는 사용 가능한 모든 Polygon 네트워크에 액세스할 수 있습니다. 특정 엔드포인트에 액세스하려면 다음 `Action` 명령을 사용합니다.  
`"managedblockchain:InvokeRpcPolygonMainnet"`

정책을 생성한 후 해당 정책을 IAM 사용자의 역할에 연결하면 정책이 적용됩니다. 에서 IAM 서비스로 AWS Management Console이동하여 IAM 사용자에게 할당된 `AmazonManagedBlockchainPolygonAccess` 역할에 정책을 연결합니다.

## 를 사용하여 AMB Access RPC 편집기에서 Polygon 원격 프로시저 호출(RPC) 요청 수행 AWS Management Console
<a name="gs-console-polygon"></a>

AMB Access Polygon을 AWS Management Console 사용하여에서 원격 프로RPCs)을 편집, 구성 및 제출할 수 있습니다. 이러한 RPCs 사용하면 데이터 검색 및 다각형 네트워크에 트랜잭션 제출을 포함하여 다각형 네트워크에서 데이터를 읽고 트랜잭션을 쓸 수 있습니다.

**Example**  
다음 예제에서는 `eth_getBlockByNumber` RPC를 사용하여 *최신* 블록에 대한 정보를 가져오는 방법을 보여줍니다. 강조 표시된 변수를 자체 입력으로 변경하거나 나열된 **RPC 메**서드 중 하나를 선택하고 필요한 관련 입력에를 입력합니다.  

1. [https://console.aws.amazon.com/managedblockchain/](https://console.aws.amazon.com/managedblockchain/) 관리형 블록체인 콘솔을 엽니다.

1. **RPC 편집기를** 선택합니다.

1. **요청** 섹션에서 **{{블록체인 네트워크}}**`{{POLYGON_MAINNET}}`로를 선택합니다.

1. **RPC 메**`{{eth_getBlockByNumber}}`서드로를 선택합니다.

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**  
AMB Access Polygon 엔드포인트에 Polygon JSON-RPC 요청을 하려면 [서명 버전 4(SigV4)](https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html)를 사용하여 IAM 사용자 자격 증명으로 요청에 서명합니다. [https://github.com/okigan/awscurl](https://github.com/okigan/awscurl) 명령줄 도구는 SigV4를 사용하여 AWS 서비스에 대한 요청에 서명하는 데 도움이 될 수 있습니다. 자세한 내용은 [awscurl README.md](https://github.com/okigan/awscurl#readme) 참조하십시오.  
운영 체제에 적합한 방법을 `awscurl` 사용하여를 설치합니다. macOS에서는 HomeBrew가 권장되는 애플리케이션입니다.  

```
brew install awscurl
```
를 이미 설치하고 구성한 경우 AWS CLI IAM 사용자 자격 증명과 기본값 AWS 리전 이 환경에 설정되고에 액세스할 수 있습니다`awscurl`. 를 사용하여 `eth_getBlockByNumber` RPC를 호출하여 Polygon *Mainnet*에 요청을 `awscurl`제출합니다. 이 호출은 정보를 검색하려는 블록 번호에 해당하는 문자열 파라미터를 수락합니다.  
다음 명령은 `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 액세스 토큰 기반 액세스 기능을 사용하여 동일한 요청을 할 수도 `Accessor` 있습니다. 자세한 내용은 [AMB Access Polygon 요청을 위한 토큰 기반 액세스를 위한 Accessor 토큰 생성 및 관리](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를 사용하여 서명된 요청을 제출하여 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* 예제에서는 [서명 버전 4(SigV4)](https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html) 및 [토큰 기반 액세스를 모두 사용하여 AMB Access Polygon 엔드포인트에 Polygon JSON-](https://docs.aws.amazon.com/managed-blockchain/latest/ambp-dg/polygon-tokens.html)RPC 요청을 수행하는 방법을 보여줍니다. 첫 번째 예제에서는 한 주소에서 다른 주소로 트랜잭션을 전송하고 다음 예제에서는 블록체인에서 트랜잭션 세부 정보 및 밸런스 정보를 요청합니다.

**Example**  
이 예제 Node.js 스크립트를 실행하려면 다음 사전 조건을 적용합니다.  

1. 시스템에 노드 버전 관리자(nvm) 및 Node.js가 설치되어 있어야 합니다. OS에 대한 설치 지침은 [여기에서](https://github.com/nvm-sh/nvm) 확인할 수 있습니다.

1. `node --version` 명령을 사용하여 *노드 버전 18* 이상을 사용하고 있는지 확인합니다. 필요한 경우 `nvm install v18.12.0` 명령을 사용한 다음 `nvm use v18.12.0` 명령을 사용하여 노드의 *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*  
다음 코드는 하드 코딩된 프라이빗 키를 사용하여 데모`Ethers.js`용으로만를 사용하여 Wallet Signer를 생성합니다. 실제 자금이 있고 보안 위험이 있으므로 프로덕션 환경에서는이 코드를 사용하지 마십시오.  
필요한 경우 계정 팀에 문의하여 wallet 및 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` 하려면 Ethereum 및 Polygon과 같은 Ethereum 호환 블록체인과 상호 작용하기 위해 널리 사용되는 라이브러리인 `Ethers.js`를 사용하는 스크립트를 사용합니다. *빨간색으로 강조* 표시된 코드의 세 가지 변수를 바꿔야 합니다. 여기에는 [토큰 기반 액세스를](https://docs.aws.amazon.com/managed-blockchain/latest/ambp-dg/polygon-tokens.html) `billingToken` 위한 *액세스 도구* 토큰의 , 트랜잭션에 서명하는 *프라이빗 키*, POL을 수신하는 *수신자의 주소가* 포함됩니다.

**작은 정보**  
기존 지갑을 재사용하여 자금 손실 위험을 없애는 대신이 목적으로 새 프라이빗 키(지갑)를 생성하는 것이 좋습니다. Ethers 라이브러리의 Wallet 클래스 메서드 createRandom()을 사용하여 테스트할 Wallet을 생성할 수 있습니다. 또한 Polygon Mainnet에서 POL을 요청해야 하는 경우 퍼블릭 POL 수도 꼭지를 사용하여 테스트에 사용할 소량을 요청할 수 있습니다.

`billingToken`, 조달된 Wallet의 *프라이빗 키* 및 수신자의 주소가 코드에 추가되면 다음 코드를 실행하여 *.0001* POL이 주소에서 다른 주소로 전송되도록 트랜잭션에 서명하고 AMB Access Polygon을 사용하여 ` eth_sendRawTransaction` JSON-RPC를 호출하는 Polygon Mainnet으로 브로드캐스트합니다.

```
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`에 있습니다. 이는 트랜잭션이 아직 Polygon 네트워크의 블록에 기록되지 않았기 때문입니다. 이러한 값은 나중에 정의되며 다음 섹션에서 트랜잭션 세부 정보를 요청할 때 표시될 수 있습니다.

### Node.js에서 트랜잭션 읽기
<a name="nodejs-read-transaction"></a>

이 섹션에서는 이전에 제출한 트랜잭션에 대한 트랜잭션 세부 정보를 요청하고 AMB Access Polygon을 사용하여 Polygon Mainnet에 대한 읽기 요청을 사용하여 수신자 주소의 POL 밸런스를 검색합니다. `readTx.js` 파일에서 레이블이 지정된 변수를 이전 섹션의 코드를 실행한 응답에서 저장`hash`한 변수{{`your-transaction-id`}}로 바꿉니다.

이 코드는 AWS SDK의 필수 [서명 버전 4(SigV4)](https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html) 모듈을 사용하여 AMB Access Polygon에 대한 HTTPS 요청에 `dispatch-evm-rpc.js`서명하고 널리 사용되는 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)*의 16진수 표현은 Ethers의 `formatEther()` 메서드를 사용하여 10진수로 변환됩니다.이 메서드는 16진수를 10진수로 변환하고 소수 자릿수를 *18(10^18)*만큼 전환하여 POL에서 실제 밸런스를 제공합니다.

**작은 정보**  
위의 코드 예제에서는 Node.js, Ethers 및 Axios를 사용하여 AMB Access Polygon에서 지원되는 몇 가지 JSON-RPCs를 활용하는 방법을 보여 주지만,이 서비스를 사용하여 예제를 수정하고 다른 코드를 작성하여 Polygon에서 애플리케이션을 빌드할 수 있습니다. AMB Access Polygon에서 지원되는 JSON-RPCs[AMB Access Polygon에서 지원되는 Managed Blockchain API 및 JSON-RPCs](polygon-api.md).