Amazon Managed Blockchain (AMB) Access Polygon 處於預覽版本,可能會有所變更。
本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
Amazon Managed Blockchain (AMB) Access Polygon 入門
使用本節中的資訊和程序,開始使用 Amazon Managed Blockchain (AMB) Access Polygon。
主題
建立 IAM 政策以存取 Polygon 區塊鏈網路
若要存取 Polygon Mainnet 的公有端點以進行 JSON-RPC 呼叫,您必須擁有具有 Amazon Managed Blockchain (AWS_ACCESS_KEY_IDAMBAWS_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 管理主控台
您可以使用 AWS 管理主控台 AMB Access Polygon 在 上編輯、設定和提交遠端程序呼叫 (RPCs)。透過這些 RPCs,您可以在多邊形網路上讀取資料和寫入交易,包括擷取資料和將交易提交至多邊形網路。
下列範例示範如何使用 eth_getBlockByNumber RPC 取得最新區塊的相關資訊。將反白顯示的變數變更為您自己的輸入,或選擇列出的其中一個 RPC 方法,然後輸入所需的相關輸入。
開啟位於 https://https://console.aws.amazon.com/managedblockchain/
的 Managed Blockchain 主控台。 選擇 RPC 編輯器。
在請求區段中,選擇
做為POLYGON_MAINNET區塊鏈網路。選擇
作為 RPC 方法。eth_getBlockByNumber輸入
latest做為封鎖號碼,然後選擇做為完整交易旗標。False然後,選擇提交 RPC。
您可以在回應區段中取得
latest區塊的結果。然後,您可以複製完整的原始交易以進行進一步分析,或在應用程式的商業邏輯中使用 。
如需詳細資訊,請參閱 AMB Access Polygon 支援的 RPCs
awscurl 使用 在 中提出 AMB Access Polygon JSON-RPC 請求 AWS CLI
使用 Signature 第 4 版 (SigV4) 使用您的 IAM 使用者憑證簽署請求,以便對 AMB Access Polygon 端點發出多邊形 JSON-RPC 請求。awscurl
使用適用於您作業系統的 方法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 存取字符型存取功能提出相同的請求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 中提出多邊形 JSON-RPC 請求
您可以使用 HTTPS 提交簽署的請求,以使用 Node.js 中的原生 https 模組存取 Polygon Mainnet 網路,或使用第三方程式庫,例如 AXIOS
若要執行此範例 Node.js 指令碼,請套用下列先決條件:
您必須在機器上安裝節點版本管理員 (nvm) 和 Node.js。您可以在此處
找到作業系統的安裝說明。 使用
node --version命令並確認您正在使用 Node 版本 18 或更新版本。如果需要,您可以使用nvm install v18.12.0命令,後面接著nvm use v18.12.0命令來安裝第 18 版,即 Node 的 LTS 版本。環境變數
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 中傳送交易
上述範例透過簽署交易並使用 AMB Access Polygon 將其廣播至 Polygon Mainnet,將原生 Polygon Mainnet 字符 (POL) 從一個地址傳送至另一個地址。若要這樣做,請使用 指令碼,該sendTx.js指令碼使用 Ethers.js,這是與多邊形等 Ethereum 和 Ethereum 相容區塊鏈互動的熱門程式庫。您需要取代程式碼中以紅色反白顯示的三個變數,包括以字符為基礎的存取權杖的 billingToken 、您用來簽署交易的私有金鑰,以及接收 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 中讀取交易
在本節中,您會為先前提交的交易請求交易詳細資訊,並使用 AMB Access Polygon 對 Polygon Mainnet 提出讀取請求,擷取收件人地址的 POL 餘額。在 readTx.js 檔案中,使用hash您在上一節中執行程式碼的回應中儲存的 取代標記為 的變數。your-transaction-id
此程式碼使用公用程式 ,dispatch-evm-rpc.js它會使用 AWS SDK 中必要的 Signature 第 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
回應代表交易詳細資訊。請注意,現在可能已定義 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 。