Tìm hiểu về Gas dành cho những nhà phát triển giao thức Tezos
Tags: gas, tezos, protocol, transaction
Published: 2022-12-06 10:04:57

# Tìm hiểu về Gas dành cho những nhà phát triển giao thức Tezos

Mỗi giao dịch trong Tezos đi kèm với một chi phí kèm theo được gọi là gas. Bất cứ khi nào bạn gửi một giao dịch, thuộc nhiều loại hoạt động quản lý "manager operation", bạn sẽ chủ yếu bắt gặp gas trong biên lai giao dịch. Nó cũng xuất hiện trong giao diện giao dịch ví, nơi nó có thể yêu cầu bạn cung cấp giá trị gas tối đa cho phép đối với giao dịch này. Chẳng hạn, bạn có thể thấy điều này nếu bạn gửi một giao dịch thông qua `octez-client`.

```
This sequence of operations was run:
      Manager signed operations:
        From: [PUBLIC_KEY_HASH]
        .... snip ....
        Gas limit: 3689
        <<<< snip >>>>
        Transaction:
          Amount: ꜩ0
          From: [PUBLIC_KEY_HASH]
          To: [CONTRACT_HASH]
          <<<< snip >>>>
          This transaction was successfully applied
          <<<< snip >>>>
          Paid storage size diff: 66 bytes
          Consumed gas: 2588.410
          Balance updates:
            [PUBLIC_KEY_HASH] ... -ꜩ0.0165
            storage fees ........................... +ꜩ0.0165
          Internal operations:
            Internal Transaction:
              Amount: ꜩ0
              From: [CONTRACT_HASH]
              To: [PUBLIC_KEY_HASH]
              <<<< snip >>>>
              Consumed gas: 1000.398
              <<<< snip >>>>
```

Chúng tôi mơ hồ kết nối khái niệm gas với chi phí liên quan đến hành động gửi giao dịch đến chuỗi khối Tezos. Bạn đã bao giờ tự hỏi gas là gì và nó dùng để làm gì chưa? Và với tư cách là nhà phát triển giao thức Tezos, bạn nên lấy những con số như thế nào? Hôm nay trong bài đăng trên blog này, chúng tôi sẽ đi sâu vào vấn đề này.

## Gas là gì và nó tốt cho cái gì?

Như bạn có thể đã biết, trạng thái chuỗi khối Tezos được duy trì chung, thay đổi và xác minh bởi những "baker" (trong Tezos, baker làm nhiệm vụ xác nhận các giao dịch trong khối, giống như miner trong bitcoin) tham gia vào một kế hoạch đồng thuận. Quan trọng nhất, sự thay đổi của trạng thái xảy ra khi các hoạt động của trình quản lý được chọn và thực hiện bởi các baker. Chúng bao gồm, nổi bật nhất nhưng không độc quyền, các cuộc gọi đến hợp đồng thông minh. Về bản chất, các baker cung cấp dịch vụ để xác thực và thay đổi trạng thái Tezos một cách an toàn thông qua các quy trình tính toán khác nhau.

Chúng tôi sẽ lấy việc thực thi các hợp đồng thông minh làm ví dụ cho cuộc thảo luận dưới đây, điều này cũng có thể được áp dụng cho tất cả các manager operations khác mà Tezos hỗ trợ. Khi một baker thực hiện một hợp đồng thông minh, có một số hoạt động được tìm thấy theo kinh nghiệm để hạn chế tài nguyên tính toán. Chúng thường chậm và bị giới hạn bởi thời gian của CPU vì nó liên quan đến số học khó (hard arithmetics), chẳng hạn như các phép toán đường cong elip (elliptic curve operations) vốn là trung tâm của mật mã học hiện đại (morden cryptography); hoặc chúng bị giới hạn bởi độ trễ I/O vì có thể cần phải đọc từ đĩa.

Theo hướng dẫn chung, đây là danh sách không đầy đủ các hoạt động trong Michelson được coi là hạn chế tài nguyên.

- Truy cập big maps
- Phân tích cú pháp Michelson từ đầu vào của người dùng thành biểu diễn bộ nhớ và giải nén chúng trở lại trước khi ghi chúng vào chuỗi
- Xây dựng các hoạt động nội bộ (internal operations) để thực hiện các manager operations, chẳng hạn như gọi một hợp đồng từ một hợp đồng khác, điều này chắc chắn liên quan đến việc phân tích cú pháp và hủy phân tích cú pháp như điểm trước đó
- Số học đường cong elip bao gồm các hoạt động BLS (BLS operations)
- Thao tác các giá trị Michelson, bao gồm đọc và phá hủy các tham số cuộc gọi hợp đồng và kho lưu trữ hợp đồng cũng như ngăn xếp trình thông dịch
Vì vậy, danh sách này về cơ bản bao gồm tất cả các hướng dẫn Michelson mà bạn có thể gặp phải khi soạn thảo một hợp đồng thông minh.

Vì các hoạt động đó tốn kém về thời gian, nên chúng mở ra cơ hội chặn tiến trình liên quan đến việc thay đổi trạng thái Tezos nếu thời gian để thực hiện chúng tích lũy trong một lệnh gọi. Điều này gây bất lợi cho hiệu suất của những baker và cuối cùng là toàn bộ chuỗi khối Tezos. Điều này có thể được khai thác thêm để khởi động cuộc tấn công Sybil bằng cách loại bỏ sự đồng thuận của các baker. Để làm như vậy, các đối thủ gửi các hoạt động gọi hợp đồng một cách chiến lược cho những baker để bão hòa thời gian CPU cho họ, với hy vọng loại bỏ những người tham gia trung thực trong giao thức đồng thuận.

Ngoài ra, cung cấp đủ ưu đãi cho các baker để cung cấp các dịch vụ của Tezos như thực hiện các hợp đồng thông minh. Có một thước đo về thời gian cần thiết để thực hiện một cuộc gọi hợp đồng sẽ là một yếu tố quan trọng trong việc đo lường các ưu đãi đối với các baker cho dịch vụ của họ.

Do đó, câu trả lời ngắn gọn cho câu hỏi về bản chất và định nghĩa của gas là nó là một tiêu chuẩn về mức tiêu thụ thời gian để cung cấp dịch vụ Tezos.

## Tại sao gas được đặt ở các giá trị này?

Rất cố gắng chỉ sử dụng thời gian CPU thô được đo để áp dụng và bao gồm từng hoạt động của trình quản lý nhận được cho các giá trị gas. Trên thực tế, hầu như tất cả các baker đều không thể sử dụng cùng một thời gian CPU cho một hoạt động cụ thể do các thông số kỹ thuật của máy khác nhau. Ngay cả trên cùng một máy, thời gian để thực hiện cùng một thao tác có thể dao động trong các lần chạy khác nhau do các yếu tố như khối lượng công việc khác đang chạy trên máy và cách hệ điều hành lên lịch cho các tác vụ. Để đo lường mức tiêu thụ tài nguyên máy tính một cách công bằng bất kể sự khác biệt về hiệu suất kim loại trần (bare-metal), một mô hình kế toán trừu tượng được giới thiệu trong mỗi giao thức Tezos.

Sự phức tạp xảy ra khi trên thực tế, hầu hết các hoạt động sẽ mất thời gian khác nhau để hoàn thành tùy thuộc vào đầu vào và các yếu tố khác. Vì lý do này, các giá trị gas được tham số hóa trên một tập hợp các đầu vào, chẳng hạn như kích thước của giá trị Michelson đầu vào nếu chúng đơn giản hoặc kích thước của big map hoặc big map đang được tra cứu. Một ví dụ thú vị là lệnh `PACK`. Các tham số khối lượng công việc của nó được chỉ định trong `Interpreter_model.ir_model`. Các giá trị gas của việc thực thi lệnh `PACK`, tuần tự hóa giá trị thời gian chạy trong khi diễn giải mã hợp đồng thành byte, được mô hình hóa tuyến tính ([modelled as linearly depending](https://gitlab.com/tezos/tezos/-/blob/444bbb721808a291afeb0b6a3f01a82260d4c32e/src/proto_alpha/lib_benchmarks_proto/interpreter_model.ml#L235)) tùy thuộc vào số lượng node trong giá trị đầu vào, kích thước của số nguyên và kích thước của chuỗi trong giá trị đầu vào.

Sau khi đưa ra các giả thuyết về mối quan hệ giữa các đầu vào tiềm năng với hiệu suất thực hiện từng lệnh và thao tác, điều còn lại phải làm là tạo các điểm chuẩn khác nhau để đo thời gian chạy của từng thao tác đó nhằm tìm ra các tham số cho mô hình của chúng tôi. Các quan sát sẽ là thời gian tính bằng nano giây được thực hiện để hoàn thành các hoạt động trong các benchmark vi mô (micro-benchmarks) và benchmark khác nhau trong các tình huống khác nhau trên máy cơ sở. Để nâng cao độ chính xác, [lasso](https://en.wikipedia.org/wiki/Lasso_(statistics)) được sử dụng để tính toán hồi quy tuyến tính (linear regression). Do đó, khi các benchmark này được chạy trên máy cơ sở (base-line machine), thời gian được báo cáo sẽ là số đơn vị gas tiêu thụ cho mỗi lần vận hành.

Vì vậy, để tóm tắt, giá gas trong giao thức được lấy trực tiếp từ số liệu thống kê thời gian chạy của từng hoạt động được coi là đáng để theo dõi trong hệ thống gas. Một bộ benchmark (benchmark suite) được sử dụng và các phương pháp thống kê được áp dụng để loại bỏ nhiễu ngẫu nhiên trong các benchmarks đó.

## Tại sao tôi không thể đạt được các giá trị gas giống nhau?
Giả sử sau khi các thay đổi đối với giao thức Tezos được triển khai, bạn chỉ cần chạy `tezos-snoop` để nhận các số tham số gas mới như được báo cáo bằng cách làm theo hướng dẫn [tại đây](https://tezos.gitlab.io/developer/snoop_interpreter.html). Tuy nhiên, nếu các lần chạy được thực hiện cục bộ trên máy của bạn, rất có thể bạn sẽ không bao giờ nhận được các số giống như quy định trong mã giao thức (protocol code). Lý do tại sao điều này xảy ra?

Câu trả lời là bạn không chạy benchmarks trên máy dòng cơ sở (base-line machine). Máy dòng cơ sở hiện được duy trì bởi Nomadic Labs, là một "Dedibox" Scaleway bare-metal dành riêng cho benchmarks ngay trước mỗi đề xuất giao thức để chuẩn bị cập nhật các thông số gas. Thông số kỹ thuật của chiếc máy này *hơi hợp lý* để nó phản ánh hiệu suất cơ bản của các baker theo nghĩa là mạng Tezos tiếp tục phát triển mà không cần các baker có hiệu suất.

Vì một lý do chính đáng, Mọi người sẽ cảm thấy phần nào đó hợp lý nhưng vẫn không thoả đáng. Cho dù Scaleway cách ly máy dòng cơ bản tốt như thế nào trong quá trình đo benchmarks, thì sự biến động về hiệu suất là không thể tránh khỏi. Nó đang chia sẻ tình trạng tắc nghẽn trên mạng, điều này ảnh hưởng đến hiệu suất truy cập ổ đĩa vì các ổ đĩa trên đám mây có khả năng được gắn từ xa. Vì lý do này, các nhà phát triển Tezos đang xem xét nâng cấp benchmarks giao thức (benchmarks protocol). Cụ thể, chúng ta sẽ thấy một quy trình mới để lấy các giá trị gas đó với sự trợ giúp của các lần chạy benchmark độc lập trên các máy đa dạng. Các số điểm benchmark sẽ được cộng lại với nhau, bằng cách chia tỷ lệ qua lại để bù cho sự khác biệt tương đối về hiệu năng của máy, để cuối cùng tạo ra các giá trị gas.


Source: https://www.marigold.dev/post/gas-for-tezos-protocol-developers

Translation by Ly Kim Quyen, Software developer at [Marigold](https://www.marigold.dev/team#protocol)