Amazon Managed Blockchain (AMB) Access Polygon 处于预览版,可能会发生变化。
本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
亚马逊托管区块链 (AMB) Access Polygon 入门
使用本节中的信息和程序,开始使用 Amazon Managed Blockchain (AMB) Access Polygon。
主题
创建用于访问 Polygon 区块链网络的 IAM 策略
要访问 Polygon 主网的公共终端节点以进行 JSON-RPC 调用,您必须拥有对亚马逊托管区块链 (AMBAWS_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 管理控制台
您可以 AWS 管理控制台 使用 AMB Access Polygon 在上编辑、配置和提交远程过程调用 (RPCs)。有了这些 RPCs,您可以在 Polygon 网络上读取数据和写入交易,包括检索数据和向 Polygon 网络提交交易。
以下示例说明如何使用 eth_getBlockByNumber RPC 获取有关最新区块的信息。将突出显示的变量更改为您自己的输入,或者选择列出的 RPC 方法之一,然后输入所需的相关输入。
打开托管区块链控制台,网址为https://console.aws.amazon.com/managedblockchain/
。 选择 RPC 编辑器。
在 “请求” 部分中,选择 “
作为”POLYGON_MAINNETBlockchain Network。选择
作为 RPC 方法。eth_getBlockByNumber输入
latest为,Block number然后选择作为 “全部交易” 标志。False然后,选择提交 RPC。
您可以在 “响应” 部分中看到
latest区块的结果。然后,您可以复制完整的原始交易以供进一步分析或在应用程序的业务逻辑中使用。
有关更多信息,请参阅 AMB Access Polygon RPCs 支持的
使用 AMB Access Polygon JSON-RPC 请求进来 awscurlAWS CLI
使用签名版本 4 (Sigv4) 使用您的 IAM 用户证书签署请求,以便向 AMB Access Polygon 终端节点发出 Polygon JSON-RPC 请求。awscurl
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 请求。
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 请求
你可以使用 HTTPS 提交签名的请求RPCs 来调用 Polygon JSON,使用 Node.js 中的原生 https 模块
要运行此示例 Node.js 脚本,请应用以下先决条件:
您的计算机上必须安装节点版本管理器 (nvm) 和 Node.js。您可以在此处
找到操作系统的安装说明。 使用
node --version命令并确认您使用的是 Node 版本 18 或更高版本。如果需要,您可以使用命令和nvm install v18.12.0命令安装版本 18,即 LTS 版本的 Node。nvm use v18.12.0环境变量
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 中发送交易
前面的示例通过签署交易并使用 AMB Access Polygon 将其广播到 Polygon 主网,将原生 Polygon 主网令牌 (POL) 从一个地址发送到另一个地址。为此,请使用该脚本,该sendTx.js脚本使用一个流行的库Ethers.js,用于与以太坊和Polygon等兼容以太坊的区块链进行交互。您需要替换代码中以红色突出显示的三个变量,包括billingToken用于基于令牌访问的 Accessor 令牌、用于签署交易的私钥以及接收 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 中读取一笔交易
在本节中,您将使用AMB Access Polygon向Polygon主网发送的读取请求来请求先前提交的交易的交易详细信息,并使用AMB Access Polygon的读取请求来检索收件人地址的POL余额。在readTx.js文件中,替换标有your-transaction-idhash您在上一节中运行代码的响应中保存的变量。
此代码使用一个实用程序dispatch-evm-rpc.js,该实用程序使用 AWS 软件开发工具包中必需的签名版本 4 (Sigv4) 模块签署向 AMB Access Polygon 的 HTTPS 请求,并使用广泛使用的 HTTP 客户端 AXIOS 发送请求。
收到的回复类似于以下内容:
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。