0 0
Read Time:8 Minute, 19 Second

Bài đăng trên blog này giới thiệu GraphGen: một công cụ dòng lệnh được sử dụng để tạo các subgraph cho Mạng lưới The Graph không sử dụng gì ngoài các tệp giao diện solidity được chú thích bằng các lệnh GraphGen đặc biệt. GraphGen sẽ không tồn tại ngày nay nếu không có sự hỗ trợ hào phóng của The Graph Foundation và chương trình tài trợ của họ 🍾.

Khi Mạng lưới The Graph được công bố vào giữa năm 2018, đây là tầm nhìn đầu tiên và quan trọng nhất về stack web3 phi tập trung, từ layer đồng thuận đến giao diện web. Ngày nay, 158 Indexers đang lập chỉ mục dữ liệu cho hàng chục giao thức trên 205 subgraph. Vì Mạng lưới The Graph ngày càng trở thành một phần quan trọng của stack web3, vì vậy các subgraph đã trở thành một nhu cầu cần thiết cho các nhà phát triển giao thức khi thực hiện các bước đột phá của họ vào internet mới thú vị này.

💡Từ thất bại đến tự động hóa

Mặc dù không phải là một quá trình quá phức tạp, nhưng việc viết một subgraph cho một giao thức nhất định không phải là nhiệm vụ dễ dàng nhất; việc tạo subgraph đơn giản nhất vẫn yêu cầu hiểu rõ về GraphQL, Typescript và cách hoạt động bên trong The Graph. Điều này có thể gây thêm căng thẳng cho các nhà phát triển giao thức, những nhà phát triển giao thức thường được tổ chức thành các team nhỏ vốn đã bị quá tải bởi ngành công nghiệp phát triển nhanh chóng. Hơn nữa, cho đến nay vẫn chưa có phương pháp viết subgraph tiêu chuẩn nào được các nhà phát triển subgraph chấp nhận (mặc dù những người giỏi ở OpenZeppelin đã đạt được một số tiến bộ về mặt này), điều này càng làm phức tạp thêm quy trình cho các team đang cố gắng tạo một subgraph cho dApp đầu tiên của họ.

Hai vấn đề này (thiếu giải pháp cho các subgraph đơn giản và thiếu tiêu chuẩn hóa) là động lực thúc đẩy sự phát triển của GraphGen . Những gì bắt đầu như một công cụ nội bộ để tạo bộ khung cho subgraph đã được cải thiện đến mức người ta có thể tạo toàn bộ subgraph (ví dụ: manifest, schema, mappings…) từ tệp giao diện solidity có chú thích!

Hầu hết các subgraph được triển khai ngày nay vẫn tương đối đơn giản về mặt chuyển đổi dữ liệu và lập chỉ mục. Các mẫu giống nhau xuất hiện trong hầu hết các subgraph: Bắt đầu từ hợp đồng kiểu “factory”, sử dụng các sự kiện hoặc lệnh gọi hàm để tìm hợp đồng mới, lưu trữ các sự kiện nhất định, cập nhật các trường nhất định… Hơn nữa, trong hầu hết các trường hợp, tồn tại một sự đối xứng nhất định giữa các hợp đồng và các sự kiện được lưu trữ trên blockchain và các thực thể được lưu trữ trong một subgraph. Trong trường hợp tệ nhất, các subgraph về cơ bản trở thành mapping 1-1 giữa các hợp đồng, các sự kiện của chúng và các thực thể đại diện cho các hợp đồng sau (nghĩa là: các trường giống nhau có trong cả hai). Điều này có nghĩa là việc viết subgraph con có lợi cho tự động hóa.

🔮 Nó hoạt động như thế nào

Ở cấp độ cao, GraphGen hoạt động bằng cách phân tích cú pháp các tệp giao diện solidity được chú thích bằng các nhận xét đặc biệt và sử dụng các định nghĩa của các giao diện cùng với các chú thích để tạo một subgraph. Dưới đây là ví dụ về tệp solidity chứa các giao diện có chú thích GraphGen.

pragma solidity >=0.5.0;

/* @gg:source
  name: Pair */
interface IUniswapV2Pair {
  /* @gg:field */
  function name() external pure returns (string memory);
  
  /* @gg:field */
  function symbol() external pure returns (string memory);
  
  /* @gg:field */
  function decimals() external pure returns (uint8);
  
  /* @gg:field */
  function totalSupply() external view returns (uint);

  ...

  /* @gg:handler 
      actions:
        - StoreEvent
        - UpdateField totalSupply */
  event Mint(address indexed sender, uint amount0, uint amount1);

  /* @gg:handler 
      actions:
        - StoreEvent
        - UpdateField totalSupply */
  event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);

  /* @gg:handler 
      actions:
        - StoreEvent
        - UpdateField price0
        - UpdateField price1 */
  event Swap(
      address indexed sender,
      uint amount0In,
      uint amount1In,
      uint amount0Out,
      uint amount1Out,
      address indexed to
  );

  /* @gg:field */
  function token0() external view returns (address);
  
  /* @gg:field */
  function token1() external view returns (address);

  /* @gg:field 
    name: price0 */
  function price0CumulativeLast() external view returns (uint);
  
  /* @gg:field 
    name: price1 */
  function price1CumulativeLast() external view returns (uint);

  ...
}

/* @gg:source
  name: Factory
  instances:
    - address: '0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f'
      startBlock: 10000834 */
interface IUniswapV2Factory {
  /* @gg:handler 
    actions:
      - NewEntity Pair from pair */
  event PairCreated(address indexed token0, address indexed token1, address pair, uint);
  
  ...
}

Giao diện Uniswap V2 với chú thích GraphGen

Đây là đủ để tạo ra một subgraph hoạt động hoàn chỉnh chỉ số các hợp đồng Factory và Pair Uniswap V2 , cũng như các sự kiện MintBurn và Swap hợp đồng cặp, đồng thời cũng cập nhật price0 và price1. Có thể tìm thấy bản phân tích đầy đủ về ví dụ này trên kho lưu trữ github của chúng tôi .

🎶 Chú thích

Có thể thấy với ví dụ trên, các chú thích của GraphGen được thiết kế để dễ hiểu và nhẹ. GraphGen hiện chỉ hỗ trợ ba loại chú thích:

  • @gg:source: Xác định một dataSource hoặc template (tùy thuộc vào tham số). Phải đặt trước một định nghĩa interface.
  • @gg:field: Xác định trường thực thể (entity field) với giá trị mặc định tùy chọn. Phải đứng trước một định nghĩa hàm view hoặc pure.
  • @gg:handler: Xác định một trình xử lý (handler) sự kiện (hoặc lệnh gọi), cũng như logic sẽ được thực hiện khi trình xử lý được kích hoạt. Phải đứng trước định nghĩa sự kiện (hoặc lệnh gọi).

❗️Handler actions (Hành động xử lý)

Cùng với ba chú thích này, GraphGen cũng hỗ trợ bốn hành động (action) cho chú thích @gg:handler :

  • StoreEvent: Khi handler được liên kết với một sự kiện, lệnh hành động (action command) này yêu cầu GraphGen: 1) Tạo một kiểu thực thể mới cho sự kiện; 2) Lưu trữ từng sự kiện đó; và 3) Thêm các edge giữa thực thể hợp đồng emitter và các thực thể sự kiện.
  • StoreCall: Tương tự như StoreEvent, nhưng để lưu trữ các lệnh gọi hàm. (Lưu ý: StoreEventvà StoreCall có thể được hợp nhất thành một lệnh hành động trong tương lai).
  • UpdateField X: Lệnh hành động này cho GraphGen biết rằng bất cứ khi nào trình xử lý được kích hoạt, trường X (của thực thể hợp đồng emitter) sẽ được cập nhật. Trường X phải được xác định bằng cách sử dụng  @gg:field chú thích trên cùng một interface.
  • NewEntity X of Y: Lệnh hành động này cho GraphGen biết rằng bất cứ khi nào handler được kích hoạt, một thực thể hợp đồng mẫu mới loại X sẽ được tạo, sử dụng trường Y của sự kiện (hoặc lệnh gọi) làm địa chỉ và id của thực thể mới này. X phải được xác định bằng cách sử dụng chú thích @gg:source.

Chúng tôi tham khảo README của repo để có mô tả kỹ lưỡng về các chú thích của GraphGen.

Những chú thích này, mặc dù không đủ mạnh để tạo mọi subgraph có thể, nhưng vẫn đủ mạnh để tạo một subgraph hoạt động cơ bản. Subgraph đã tạo luôn có thể được chỉnh sửa theo cách thủ công nếu cần.

Lưu ý quan trọng: GraphGen vẫn đang trong quá trình phát triển tích cực và chỉ nên được sử dụng trong sản xuất một cách thận trọng. Hơn nữa, các subgraph được tạo có thể không phải lúc nào cũng tối ưu theo quan điểm lập chỉ mục.

Tiến tới tương lại

Đây chỉ là phiên bản đầu tiên của GraphGen và chúng tôi mong nhận được phản hồi của cộng đồng The Graph. Trên thực tế, chúng tôi mời bất kỳ ai trong cộng đồng The Graph trở thành người đồng sáng tạo trong dự án này. Đối với bất kỳ yêu cầu tính năng hoặc báo cáo lỗi nào, chúng tôi khuyên bạn nên tạo một issue trong kho lưu trữ của GraphGen tại đây .

🙋🏽Giới thiệu về chúng tôi @Protean labs

Chúng tôi là một team nhỏ gồm những sinh viên mới tốt nghiệp kỹ thuật và crypto natives có trụ sở tại Montreal, Canada. Mỗi thành viên trong team đều có chung niềm đam mê sâu sắc với decentralization. Chúng tôi hình dung ra một tương lai nơi nền kinh tế của Internet và các ưu đãi của nó phù hợp hơn với xã hội rộng lớn hơn.

Để theo đuổi những lý tưởng này và tổ chức các dự án chung của chúng tôi, chúng tôi đã tạo ra Protean Labs, một công ty với mục tiêu hiện tại là xây dựng nhiều phần khác nhau của cơ sở hạ tầng và công cụ dành cho nhà phát triển xung quanh hệ sinh thái Web3. GraphGen là dự án mã nguồn mở công khai đầu tiên của chúng tôi được thực hiện bởi The Graph Foundation và chương trình tài trợ của họ. Chúng tôi rất vui khi nhận được tài trợ cho 2 dự án khác nhau, GraphGen và The Mesh Engine & Language. Sắp có thêm thông tin chi tiết cho phần sau…

Hãy theo dõi các thông báo sắp tới (sắp tới 😏) về những nỗ lực tiếp theo của chúng tôi!

Christophe, Thierry & Mathieu

Link gốc: https://medium.com/protean-labs/introducing-graphgen-a-subgraph-generator-for-the-graph-network-836fe0385336

THEGRAPHVN – Tham gia các cộng đồng The Graph Việt Nam tại:

Website tin tức

Telegram tin tức

Cộng đồng Telegram

Happy
Happy
0 %
Sad
Sad
0 %
Excited
Excited
0 %
Sleepy
Sleepy
0 %
Angry
Angry
0 %
Surprise
Surprise
0 %

Average Rating

5 Star
0%
4 Star
0%
3 Star
0%
2 Star
0%
1 Star
0%

Leave a Reply

Your email address will not be published. Required fields are marked *