นี่คือคู่มือระดับเริ่มต้นสำหรับการใช้ WebSockets และ Alchemy เพื่อส่งคำขอไปยัง Ethereum blockchain

WEBSOCKETS กับ HTTP

WebSockets ต่างจาก HTTP ตรงที่คุณไม่จำเป็นต้องส่งคำขออย่างต่อเนื่องเมื่อคุณต้องการข้อมูลเฉพาะ WebSockets รักษาการเชื่อมต่อเครือข่ายสำหรับคุณ (หากทำถูกต้อง) และรับฟังการเปลี่ยนแปลง

เช่นเดียวกับการเชื่อมต่อเครือข่ายใดๆ คุณไม่ควรทึกทักเอาเองว่า WebSocket จะยังคงเปิดอยู่ตลอดไปโดยไม่มีการหยุดชะงัก แต่การจัดการการเชื่อมต่อที่หลุดและการเชื่อมต่อใหม่ด้วยมืออย่างถูกต้องอาจเป็นเรื่องยากที่จะทำให้ถูกต้อง ข้อเสียอีกประการหนึ่งของ WebSockets คือคุณไม่ได้รับรหัสสถานะ HTTP ในการตอบกลับ แต่จะมีเพียงข้อความแสดงข้อผิดพลาดเท่านั้น

​Alchemy Web3 จะเพิ่มการจัดการสำหรับความล้มเหลว WebSocket และลองกับการกำหนดค่าไม่จำเป็นต้อง

ลองเลย

วิธีที่ง่ายที่สุดในการทดสอบออก WebSockets คือการติดตั้งเครื่องมือบรรทัดคำสั่งสำหรับการทำ WebSocket ร้องขอเช่นwscat เมื่อใช้ wscat คุณสามารถส่งคำขอได้ดังนี้:

หมายเหตุ: หากคุณมีบัญชี Alchemy คุณสามารถแทนที่ demo ด้วยคีย์ API ของคุณเอง ลงทะเบียนสำหรับบัญชี Alchemy ฟรีที่นี่!

$ wscat -c wss://eth-mainnet.ws.alchemyapi.io/ws/demo

>  {"jsonrpc":  "2.0", "id": 0, "method":  "eth_gasPrice"}

<  {"jsonrpc":  "2.0", "result":  "0xb2d05e00", "id": 0}

วิธีใช้ WEBSOCKETS

ในการเริ่มต้น เปิด WebSocket โดยใช้ WebSocket URL สำหรับแอปของคุณ คุณสามารถค้นหา URL WebSocket ของแอปได้โดยเปิดหน้าของแอปใน แดชบอร์ด แล้วคลิกที่ "ดูคีย์" 

หมายเหตุ : โปรดทราบว่า URL ของแอปสำหรับ WebSockets จะแตกต่างจาก URL สำหรับคำขอ HTTP แต่สามารถค้นหาทั้งสองรายการได้โดยคลิก "ดูคีย์"

ภาพจาก https://ethereum.org/en/developers/tutorials/using-websockets/

API ใดๆ ที่ระบุไว้ในการอ้างอิง Alchemy APIสามารถใช้ได้ผ่าน WebSocket ในการดำเนินการดังกล่าว ให้ใช้เพย์โหลดเดียวกันกับที่จะส่งเป็นเนื้อหาของคำขอ HTTP POST แต่ให้ส่งเพย์โหลดนั้นผ่าน WebSocket แทน

ด้วย WEB3

การเปลี่ยนไปใช้ WebSockets ขณะใช้ไลบรารีของไคลเอ็นต์ เช่น Web3 นั้นเป็นเรื่องง่าย เพียงส่ง WebSocket URL แทน HTTP เมื่อสร้างอินสแตนซ์ไคลเอ็นต์ Web3 ของคุณ ตัวอย่างเช่น :

const web3 = new Web3("wss://eth-mainnet.ws.alchemyapi.io/ws/your-api-key")

web3.eth.getBlockNumber().then(console.log) // -> 7946893

SUBSCRIPTION API

เมื่อเชื่อมต่อผ่าน WebSocket คุณอาจใช้สองวิธีเพิ่มเติม : eth_subscribe และ eth_unsubscribe. วิธีการเหล่านี้จะช่วยให้คุณรับเหตุการณ์เฉพาะและได้รับการแจ้งทันที

eth_subscribe

สร้างการสมัครใหม่สำหรับเหตุการณ์ที่ระบุ เรียนรู้เพิ่มเติมเกี่ยวกับ eth_subscribe

Parameters

1. Subscription types

2. Optional params

อาร์กิวเมนต์แรกระบุประเภทของเหตุการณ์ที่จะรับฟัง อาร์กิวเมนต์ที่สองมีตัวเลือกเพิ่มเติมซึ่งขึ้นอยู่กับอาร์กิวเมนต์แรก ประเภทคำอธิบายต่างๆ ตัวเลือก และ เพย์โหลดของเหตุการณ์ได้อธิบายไว้ด้านล่าง

Returns

ID การสมัครรับข้อมูล : ID นี้จะแนบไปกับกิจกรรมที่ได้รับ และยังใช้เพื่อยกเลิกการสมัครรับข้อมูลโดยใช้ eth_unsubscribe.

Subscription events

ในขณะที่การสมัครใช้งานอยู่ คุณจะได้รับกิจกรรมที่เป็น Object ที่มีฟิลด์ต่อไปนี้:

  • jsonrpc : "2.0"
  • method : "eth_subscription" 
  • params : Object ที่มีฟิลด์ต่อไปนี้ :
    • subscription : ID การสมัครรับข้อมูลที่ส่งคืนโดยการ call eth_subscription ซึ่งสร้างการสมัครรับข้อมูลนี้
    • result : ออบเจ็กต์ที่มีเนื้อหาแตกต่างกันไปตามประเภทของการสมัครรับข้อมูล

Subscription types

1. alchemy_newFullPendingTransactions

ส่งกลับข้อมูลธุรกรรมสำหรับธุรกรรมทั้งหมดที่เพิ่มไปยังสถานะรอดำเนินการ ประเภทการสมัครนี้สมัครรับธุรกรรมที่รอดำเนินการ ซึ่งคล้ายกับการเรียกใช้ Web3 มาตรฐาน web3.eth.subscribe("pendingTransactions") แต่แตกต่างกันตรงที่ปล่อย ข้อมูลธุรกรรมทั้งหมด มากกว่าเพียงแค่แฮชของธุรกรรม

ตัวอย่าง:

>  {"jsonrpc":  "2.0",  "id":  1,  "method":  "eth_subscribe",  "params":  ["alchemy_newFullPendingTransactions"]}

<  {"id":1,"result":"0x9a52eeddc2b289f985c0e23a7d8427c8","jsonrpc":"2.0"}
<  {
      "jsonrpc":"2.0",
      "method":"eth_subscription",
      "params":{
          "result":{
          "blockHash":null,
          "blockNumber":null,
          "from":"0xa36452fc31f6f482ad823cd1cf5515177d57667f",
          "gas":"0x1adb0",
          "gasPrice":"0x7735c4d40",
          "hash":"0x50bff0736c713458c92dd1848d12f3354149be1363123dae35e94e0f2a9d56bf",
"input":"0xa9059cbb0000000000000000000000000d0707963952f2fba59dd06f2b425ace40b492fe0000000000000000000000000000000000000000000015b1111266cfca100000",
          "nonce":"0x0",
          "to":"0xea38eaa3c86c8f9b751533ba2e562deb9acded40",
          "transactionIndex":null,
          "value":"0x0",
          "v":"0x26",
          "r":"0x195c2c1ed126088e12d290aa93541677d3e3b1d10f137e11f86b1b9227f01e3b",
          "s":"0x60fc4edbf1527832a2a36dbc1e63ed6193a6eee654472fbebbf88ef1750b5344"},
          "subscription":"0x9a52eeddc2b289f985c0e23a7d8427c8"
      }
  }

2. newHeads

ปล่อยเหตุการณ์ทุกครั้งที่มีการเพิ่มส่วนหัวใหม่ลงใน chain รวมทั้งในระหว่างการจัดโครงสร้าง chain ใหม่

เมื่อเกิดการปรับโครงสร้างองค์กรใหม่ การสมัครสมาชิกนี้จะปล่อยเหตุการณ์ที่มีส่วนหัวใหม่ทั้งหมดสำหรับ chain ใหม่ โดยเฉพาะอย่างยิ่ง ซึ่งหมายความว่าคุณอาจเห็นส่วนหัวหลายรายการที่มีความสูงเท่ากัน และเมื่อเกิดเหตุการณ์นี้ส่วนหัวถัดไปควรใช้เป็นส่วนหัวที่ถูกต้องหลังจากการจัดระเบียบใหม่

ตัวอย่าง:

>  {"jsonrpc":  "2.0",  "id":  1,  "method":  "eth_subscribe",  "params":  ["newHeads"]}

<  {"jsonrpc":"2.0","id":2,"result":"0x9ce59a13059e417087c02d3236a0b1cc"}
<  {
  "jsonrpc":  "2.0",
  "method":  "eth_subscription",
  "params":  {
      "result":  {
          "difficulty":  "0x15d9223a23aa",
          "extraData":  "0xd983010305844765746887676f312e342e328777696e646f7773",
          "gasLimit":  "0x47e7c4",
          "gasUsed":  "0x38658",
          "logsBloom":
"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
          "miner":  "0xf8b483dba2c3b7176a3da549ad41a48bb3121069",
          "nonce":  "0x084149998194cc5f",
          "number":  "0x1348c9",
          "parentHash":  "0x7736fab79e05dc611604d22470dadad26f56fe494421b5b333de816ce1f25701",
          "receiptRoot":  "0x2fab35823ad00c7bb388595cb46652fe7886e00660a01e867824d3dceb1c8d36",
          "sha3Uncles":  "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
          "stateRoot":  "0xb3346685172db67de536d8765c43c31009d0eb3bd9c501c9be3229203f15f378",
          "timestamp":  "0x56ffeff8",
          "transactionsRoot":  "0x0167ffa60e3ebc0b080cdb95f7c0087dd6c0e61413140e39d94d3468d7c9689f"
      },
  "subscription":  "0x9ce59a13059e417087c02d3236a0b1cc"
  }
}

3. log

ส่ง log ซึ่งเป็นส่วนหนึ่งของบล็อกที่เพิ่มใหม่ซึ่งตรงกับเกณฑ์ตัวกรองที่ระบุ

เมื่อมีการปรับโครงสร้าง Chain เกิดขึ้น การบันทึกซึ่งเป็นส่วนหนึ่งของบล็อกใน Chain เก่าจะถูกปล่อยออกมาอีกครั้งกับสถานที่ตั้ง removed true นอกจากนี้ log ที่เป็นส่วนหนึ่งของบล็อกใน Chain ใหม่จะถูกปล่อยออกมา ซึ่งหมายความว่าเป็นไปได้ที่จะเห็น log สำหรับธุรกรรมเดียวกันหลายครั้งในกรณีที่มีการจัดโครงสร้างใหม่

พารามิเตอร์

  1. วัตถุที่มีฟิลด์ต่อไปนี้:
    • adddress (ทางเลือก): สตริงที่แสดงที่อยู่หรืออาร์เรย์ของสตริงดังกล่าว
      • เฉพาะบันทึกที่สร้างจากที่อยู่เหล่านี้เท่านั้นที่จะถูกปล่อยออกมา
    • topics: อาร์เรย์ของตัวระบุหัวข้อ
      • ตัวระบุหัวข้อแต่ละตัวคือnullสตริงที่แสดงหัวข้อ หรืออาร์เรย์ของสตริง
      • แต่ละตำแหน่งในอาร์เรย์ซึ่งไม่nullจำกัดการบันทึกที่ส่งออกไปเฉพาะผู้ที่มีหนึ่งในหัวข้อที่กำหนดในตำแหน่งนั้น

ตัวอย่างของข้อกำหนดเฉพาะของหัวข้อ :

  • []: หัวข้อใดก็ได้ที่อนุญาต
  • [A]: A อยู่ในตำแหน่งแรก (และอะไรก็ได้หลังจากนั้น)
  • [null, B]: อะไรก็ได้ที่อยู่ในตำแหน่งแรกและ B ในตำแหน่งที่สอง (และอะไรก็ได้หลังจากนั้น)
  • [A, B]: A ในตำแหน่งแรกและ B ในตำแหน่งที่สอง (และอะไรก็ได้หลังจากนั้น)
  • [[A, B], [A, B]]: (A หรือ B) ในตำแหน่งแรกและ (A หรือ B) ในตำแหน่งที่สอง (และอะไรก็ได้หลังจากนั้น)

ตัวอย่าง:

>  {"jsonrpc":  "2.0",  "id":  1,  "method":  "eth_subscribe",  "params":  ["logs",  {"address":  "0x8320fe7702b96808f7bbc0d4a888ed1468216cfd",  "topics":  ["0xd78a0cb8bb633d06981248b816e7bd33c2a35a6089241d099fa519e361cab902"]}]}

<  {"jsonrpc":"2.0","id":2,"result":"0x4a8a4c0517381924f9838102c5a4dcb7"}
<  {
  "jsonrpc":  "2.0",
  "method":  "eth_subscription",
  "params":  {
      "subscription":  "0x4a8a4c0517381924f9838102c5a4dcb7",
      "result":  {
          "address":  "0x8320fe7702b96808f7bbc0d4a888ed1468216cfd",
          "blockHash":  "0x61cdb2a09ab99abf791d474f20c2ea89bf8de2923a2d42bb49944c8c993cbf04",
          "blockNumber":  "0x29e87",
          "data": "0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003",
          "logIndex":"0x0",
          "topics":["0xd78a0cb8bb633d06981248b816e7bd33c2a35a6089241d099fa519e361cab902"],
          "transactionHash":  "0xe044554a0a55067caafd07f8020ab9f2af60bdfe337e395ecd84b4877a3d1ab4",
          "transactionIndex":  "0x0"
      }
  }
}

eth_unsubscribe

ยกเลิกการสมัครรับข้อมูลที่มีอยู่เพื่อไม่ให้มีการส่งกิจกรรมเพิ่มเติม

Parameters

  1. ID การสมัครรับข้อมูลที่ส่งกลับจากการeth_subscribeโทรก่อนหน้านี้

Returns

trueหากการสมัครสมาชิกถูกยกเลิกสำเร็จ หรือfalseหากไม่มีการสมัครสมาชิกที่มี ID ที่ระบุ

ตัวอย่าง :

Request

curl https://eth-mainnet.alchemyapi.io/v2/your-api-key
-X POST
-H "Content-Type: application/json"
-d '{"id": 1, "method": "eth_unsubscribe", "params": ["0x9cef478923ff08bf67fde6c64013158d"]}'

Result

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": true
}

Sign up with Alchemy for free,

check out our documentation,

and for the latest news, follow us on Twitter.

 

เรียบเรียงข้อมูลจากเว็บไซต์ ethereum.org > developers > tutorials

แปลไทยโดย GridsMicro