開始使用 Amazon Managed Blockchain(AMB)訪問多邊形 - AMB訪問多邊形

Amazon Managed Blockchain(AMB)訪問多邊形處於預覽版本中,可能會發生變化。

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

開始使用 Amazon Managed Blockchain(AMB)訪問多邊形

使用本節中的資訊和程序,開始使用 Amazon Managed Blockchain (AMB) 存取多邊形。

建立 IAM 政策以存取多邊形區塊鏈網路

若要存取多邊形主網的公用端點以進行 JSON-RPC 呼叫,您必須擁有具有 Amazon Managed Blockchain (AMBAWS_SECRET_ACCESS_KEY) 存取多邊形的適當 IAM 許可的使用者登入資料 (AWS_ACCESS_KEY_ID和)。在 AWS CLI 已安裝的終端機中,執行以下命令以建立 IAM 政策以存取兩個 Polygon 端點:

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 Management Console,導覽至 IAM 服務,並將政策附加AmazonManagedBlockchainPolygonAccess到指派給 IAM 使用者的角色。

在 AMB 存取 RPC 編輯器上使用 AWS Management Console

您可以在 AWS Management Console 使用 AMB 存取多邊形上編輯、設定和提交遠端程序呼叫 (RPC)。使用這些 RPC,您可以在 Polygon 網絡上讀取數據和寫入交易,包括檢索數據並將交易提交到 Polygon 網絡。

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

  1. https://console.aws.amazon.com/managedblockchain/ 開啟受管理區塊鏈主控台。

  2. 選擇 RPC 編輯器

  3. 在「請求」部分中,選擇POLYGON_MAINNET作為區塊鏈網絡

  4. 選擇eth_getBlockByNumber作為 RPC 方法

  5. 輸入latest區塊編號,並選擇False作為完整交易旗標

  6. 然後,選擇「提交 RPC」。

  7. 您會在 [回應] 區段中取得區latest塊的結果。然後,您可以複製完整的原始交易以供進一步分析,或在應用程式的商務邏輯中使用。

如需詳細資訊,請參閱 AMB 存取多邊形支援的 RPC

透過使用 awscurlAWS CLI

使用簽名版本 4 (SIGv4) 使用您的 IAM 使用者登入資料簽署請求,以便向 AMB 存取多邊形端點發出多邊形 JSON-RPC 要求。命awscurl令行工具可以幫助您使用 Sigv4 對 AWS 服務簽署請求。如需詳細資訊,請參閱 .md。

使awscurl用適合您作業系統的方法進行安裝。在 macOS 上,建議使 HomeBrew 用以下應用程式:

brew install awscurl

如果您已安裝並設定 AWS CLI,則您的 IAM 使用者登入資料和預 AWS 區域 設值會在您的環境中設定,並可存取awscurl。使用awscurl,通過調用 RPC 向多邊形主網提交請求。eth_getBlockByNumber此呼叫接受對應於您要擷取資訊的區塊編號的字串參數。

下列命令會使用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 訪問多邊形請求

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 請求

您可以通過使用 HTTPS 提交簽名的請求來使用 Node.js 中的本機 https 模塊訪問多邊形主網絡來調用多邊形 JSON-RPC,或者您可以使用第三方庫,例如 AXIOS。下列 Node.js 範例說明如何使用簽章版本 4 (SIGv4) 和基於權杖的存取,向 AMB 存取多邊形端點發出多邊形 JSON-RPC 要求。第一個示例將交易從一個地址發送到另一個地址,下面的示例從區塊鏈請求交易詳細信息和餘額信息。

若要執行此範例 Node.js 指令碼,請套用下列先決條件:

  1. 您的電腦上必須安裝節點版本管理員 (nvm) 和 Node.js。您可以這裡找到作業系統的安裝說明。

  2. 使用指node --version令並確認您使用的是節點版本 18 或更高版本。如果需要,您可以使用nvm install v18.12.0命令,然後使用nvm use v18.12.0命令來安裝節點的 LTS 版本 18 版本。

  3. 環境變數AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY必須包含與您的帳戶相關聯的認證。

    使用下列命令將這些變數匯出為用戶端上的字串。將下列字串中的紅色值取代為 IAM 使用者帳戶中的適當值。

    export AWS_ACCESS_KEY_ID="AKIAIOSFODNN7EXAMPLE" export AWS_SECRET_ACCESS_KEY="wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"

完成所有必要條件之後,請使用偏好的程式碼編輯器,將下列檔案複製到本機環境中的目錄中:

包裝

{ "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用僅用於演示。請勿在生產環境中使用此代碼,因為它具有真正的資金並帶來安全風險。

如有需要,請聯絡您的帳戶團隊,以提供有關錢包和簽署者最佳做法的建議。

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 訪問多邊形將其廣播到多邊形主網從一個地址發送本地多邊形主網(POL)到另一個地址。為此,請使用腳本,該sendTx.js腳本使用了一個流行的庫Ethers.js,用於與以太坊和以太坊兼容的區塊鏈(如 Polygon)進行交互。您需要替換以紅色突出顯示的代碼中的三個變量,包括基於令牌的問令牌的訪問令牌,用於簽署事務的私鑰以及接收 POL 的收件人的地址billingToken

提示

我們建議您為此創建一個新的私鑰(錢包),而不是重複使用現有錢包以消除資金損失的風險。您可以使用以太函式庫的錢包類別方法 createranDOM () 來產生要測試的錢包。此外,如果您需要從多邊形主網請求 POL,則可以使用公共 POL 水龍頭請求少量用於測試。

一旦您billingToken有了資金錢包的私鑰,並將收件人的地址添加到代碼中,您可以運行以下代碼來簽署 .0001 POL 的交易,以從您的地址發送到另一個地址並將其廣播到使用 AMB 訪問多邊形調用 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。這是您剛提交到區塊鏈的交易標識符。您可以在讀取交易範例中使用此屬性,以從多邊形主網取得有關此交易的其他詳細資訊。

請注意,blockNumberblockHashnull在回應中。這是因為交易尚未記錄在 Polygon 網路上的一個區塊中。請注意,這些值會在稍後定義,您可能會在下一節要求交易詳細資訊時看到這些值。

在 Node.js 中讀取交易

在本節中,您要求先前提交的交易詳細信息,並使用 AMB Access Polygon 向多邊形主網讀取請求來檢索收件人地址的 POL 餘額。在readTx.js檔案中,取代標示your-transaction-idhash您在上一節執行程式碼時所儲存的回應中所儲存的變數。

此代碼使用一個實用程序dispatch-evm-rpc.js,該實用程序使用 AWS SDK 中必需的簽名版本 4(Sigv4)模塊對 AMB 訪問多邊形簽名 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)的十六進制表示使用以太網的方法轉換為十進制,該formatEther()方法將十六進制轉換為十進制,並將小數位移動 18(10 ^ 18),以獲得 POL 中的真正平衡。

提示

雖然前面的程式碼範例說明如何使用 Node.js、乙醚和 Axios 來利用 AMB 存取多邊形上支援的 JSON RPC,但您可以修改範例,並撰寫其他程式碼,以便使用此服務在多邊形上建置您的應用程式。如需 AMB 存取多邊形上受支援 JSON RPC 的完整清單,請參閱。受管理的區塊鏈 API 和支持 AMB 訪問多邊形的 JSON-RPC