Xác minh Zcash trên Ethereum nhờ EIP-152: Giải pháp tối ưu hóa gas ít người biết đến

07 tháng 4, 2026·4 phút đọc

EIP-152 cung cấp một precompile trên Ethereum giúp tính toán hàm băm BLAKE2b với chi phí cực thấp, giảm 280 lần phí gas so với Solidity thông thường. Bài viết này phân tích cách sử dụng tính năng này để xác minh bằng chứng Zcash trên chuỗi, biến một nhiệm vụ bất khả thi về mặt chi phí trở nên khả thi.

Xác minh Zcash trên Ethereum nhờ EIP-152: Giải pháp tối ưu hóa gas ít người biết đến

Ethereum có một hợp đồng tiền biên (precompile) mà hầu như không ai biết đến. Nó nằm tại địa chỉ 0x09, có nhiệm vụ tính toán hàm nén BLAKE2b, và được đưa vào mạng lưới với mục đích cụ thể: cho phép xác minh Zcash trên Ethereum. Đây là câu chuyện về cách chúng tôi sử dụng nó.

EIP-152 là gì?

EIP-152 được tích hợp trong bản nâng cấp Istanbul hard fork (tháng 12 năm 2019). Nó cung cấp hàm nén F của BLAKE2b dưới dạng một hợp đồng tiền biên tại địa chỉ 0x09. Chi phí sử dụng là 1 gas cho mỗi vòng lặp. Một cuộc gọi BLAKE2b tiêu chuẩn chạy 12 vòng, nên tổng chi phí chỉ là 12 gas.

BLAKE2b là hàm băm nền tảng cho các cây Merkle Sapling và NU5 của Zcash. Nếu không có precompile này, việc tính toán BLAKE2b trong Solidity tốn khoảng 200.000 gas. Nhưng với nó, chi phí chỉ còn 712 gas cho một lần băm đầy đủ. Đây là mức giảm ấn tượng 280 lần.

Đề xuất EIP này được đưa ra bởi Tjaden Hess và các thành viên khác của Quỹ Ethereum, được thúc đẩy bởi một mục tiêu duy nhất: kích hoạt khả năng xác minh light-client của Zcash trên Ethereum mà không phải chịu chi phí gas phi lý.

Tại sao nó lại quan trọng?

Việc xác minh bằng chứng cross-chain (chuỗi chéo) cần các hàm băm. Zcash sử dụng BLAKE2b với các chuỗi cá nhân hóa (personalization strings) để phân tách miền. Mỗi cấp độ cây, mỗi ngữ cảnh giao thức sử dụng một chuỗi cá nhân hóa khác nhau. Ví dụ: ZcashPedersenHash cho cây cam kết ghi chú (note commitment trees) và ZTxIdHeadersHash cho ID giao dịch.

Nếu bạn không thể tính toán các băm này rẻ tiền trên chuỗi (on-chain), bạn hoàn toàn không thể xác minh trạng thái Zcash trên Ethereum. Precompile này làm cho điều đó trở nên khả thi.

Định dạng đầu vào 213 Byte

Precompile này mong đợi chính xác 213 byte đầu vào theo cấu trúc sau:

TrườngByteMô tả
rounds4Số vòng lặp (12 cho BLAKE2b)
h64Vector trạng thái (8 x uint64 LE)
m128Khối tin nhắn
t[0]8Bộ đếm offset thấp (uint64 LE)
t[1]8Bộ đếm offset cao (uint64 LE)
f1Cờ khối cuối cùng (0 hoặc 1)

Tổng cộng: 4 + 64 + 128 + 8 + 8 + 1 = 213 byte. Bạn nhận về 64 byte: vector trạng thái đã được cập nhật.

Cách gọi Precompile

Dưới đây là cách ZAP1Verifier.sol gọi hàm này:

function blake2b(
      uint32 rounds,
      bytes memory h,
      bytes memory m,
      uint64 t0,
      uint64 t1,
      bool isFinal
  ) internal view returns (bytes memory) {
      bytes memory input = abi.encodePacked(
          bytes4(rounds),
          h,
          m,
          bytes8(t0),
          bytes8(t1),
          isFinal ? bytes1(0x01) : bytes1(0x00)
      );

      (bool ok, bytes memory out) = address(0x09).staticcall(input);
      require(ok, "BLAKE2b precompile failed");
      return out;
}

Chúng ta thực hiện staticcall đến 0x09. Không cần mã hóa ABI. Không cần bộ chọn hàm. Byte thô vào, byte thô ra. Precompile sẽ xử lý phần còn lại.

Chuỗi cá nhân hóa (Personalization Strings)

Phân tách miền của Zcash hoạt động bằng cách XOR một chuỗi cá nhân hóa 16 byte vào vector trạng thái ban đầu (byte 32-47 của h). Mỗi ngữ cảnh giao thức nhận được chuỗi riêng của nó. Khi xác minh đường dẫn Merkle của cam kết ghi chú Sapling, bạn đặt chuỗi cá nhân hóa thành hằng số Zcash phù hợp trước mỗi lần gọi nén.

Điều này là bắt buộc. Sai chuỗi cá nhân hóa dẫn đến sai băm và xác minh thất bại. Precompile không thực thi việc cá nhân hóa; hợp đồng của bạn phải thiết lập h chính xác trước khi gọi 0x09.

Thực tế về chi phí Gas

Một bằng chứng Merkle cho cây Sapling của Zcash có độ sâu 32 cấp. Mỗi cấp độ cần một lần nén BLAKE2b. Với precompile, chi phí băm khoảng 32 x 712 = ~22.800 gas. Trong Solidity thuần túy: 32 x 200.000 = 6,4 triệu gas. Con số sau sẽ vượt xa giới hạn gas của khối.

Precompile không chỉ giúp tiết kiệm tiền. Nó làm cho việc xác minh trở nên khả thi về mặt kỹ thuật.

Đã hoạt động trên Mainnet

ZAP1Verifier đã được triển khai trên mạng chính Ethereum tại địa chỉ 0x12db453A7181E369cc5C64A332e3808e807057C1. Nó xác minh bằng chứng Merkle Sapling của Zcash sử dụng precompile EIP-152.

Cùng một hợp đồng cũng đang hoạt động trên Arbitrum, Base, Hyperliquid và Sepolia.

Nguồn: Frontier-Compute/zap1-verify-sol

Kết luận

Precompile này đã có trên Ethereum từ năm 2019. Hầu như không ai sử dụng nó. Nhưng chúng tôi thì có.

Bài viết được tổng hợp và biên soạn bằng AI từ các nguồn tin tức công nghệ. Nội dung mang tính tham khảo. Xem bài gốc ↗