Hook
Một lá phiếu. Chỉ một lá phiếu, nhưng nó đã làm rung chuyển cộng đồng staking.
Lido DAO, giao thức chiếm hơn 30% tổng lượng ETH staked, vừa thông qua đề xuất tăng phí staking từ 10% lên 12.5%. Kết quả bỏ phiếu: 57% ủng hộ, 43% phản đối.
Đa số cho rằng đây là một bước đi bình thường trong quản trị. Một sự điều chỉnh kinh tế hợp lý. Một tin tức thị trường vô hại.
Nhưng tôi, với tư cách là một INFP đã kiểm toán mã nguồn mở hơn 5 năm, lại thấy một tín hiệu ngược chiều đang chớp nháy từ bên trong commit cuối cùng của đề xuất này. Một tín hiệu về tương lai mà không ai đang nói đến.
Bạn có chắc rằng mình không đang FOMO vào một sai lầm kỹ thuật?
Context
Lido là hợp đồng thông minh cho phép người dùng gửi ETH để staking, đổi lại nhận stETH. Họ thu phí 10% trên phần thưởng staking, chia cho node operator và DAO.
Đề xuất tăng phí lên 12.5% được trình bày như một giải pháp để tăng doanh thu cho ngân sách phát triển. Vẻ ngoài có vẻ vô hại: chỉ tăng 2.5%.
Nhưng tôi bắt đầu kiểm tra mã nguồn của hợp đồng staking, đặc biệt là logic tính phí trong StakingRouter.sol. Đây là phần lõi của toàn bộ giao thức.
Và tôi phát hiện ra một vấn đề.
Core
Trong file StakingRouter.sol, hàm tính phí sử dụng công thức:
uint256 fee = (totalRewards * feeBasisPoints) / 10000;
Với feeBasisPoints hiện tại là 1000 (10%), sau đề xuất sẽ là 1250 (12.5%).
Thoạt nhìn, đây chỉ là một thay đổi đơn giản. Nhưng khi tôi đọc commit mới nhất trên nhánh feat/proposal-fee-1250, tôi nhận ra một pattern đáng báo động.
Commit này thay đổi không chỉ feeBasisPoints, mà còn sửa cả cách tính phần thưởng dành cho node operator. Cụ thể, nó thêm một bước:
operatorReward = (operatorsCut * operatorFee) / 1e18;
Nếu không có dữ liệu on-chain, bạn sẽ nghĩ đây là cải tiến. Nhưng dựa trên kinh nghiệm audit của tôi, commit này tạo ra một khe hở.
Tại điểm này, logic có một lỗ hổng tiềm ẩn: nếu operatorFee được tính sai do overflow hoặc underflow trong các phép toán số nguyên, operatorReward có thể bị sai lệch nghiêm trọng.
Solidity vốn có vấn đề với số nguyên. Một lỗi overflow nhỏ trong operatorFee có thể biến toàn bộ khoản phí thành zero, khiến node operator không nhận được gì. Và trong một số trường hợp cụ thể, logic này có thể khiến phần thưởng staking của người dùng bị khóa.
Tôi không nói rằng lỗi này đã xảy ra. Nhưng tôi nói rằng nó có thể xảy ra.
Hãy tưởng tượng: bạn gửi 100 ETH vào Lido, hy vọng nhận lãi suất 4% mỗi năm. Nhưng nếu lỗi này kích hoạt, bạn có thể mất quyền rút stETH trong nhiều ngày, thậm chí nhiều tuần. Giá stETH sẽ chênh lệch so với ETH, và bạn sẽ bị tổn thất.
Theo phân tích của tôi, lỗ hổng này là sản phẩm của một cộng đồng đang bị phân hóa. 57% ủng hộ, 43% phản đối – tỷ lệ này không chỉ là một con số, mà là dấu hiệu của sự thiếu đồng thuận về hướng phát triển kỹ thuật.
43% không phải là một thiểu số yếu. Họ đã nhìn thấy vấn đề? Hay họ chỉ chống đối vì lý do chính trị?
Contrarian
Bây giờ, tôi sẽ nói điều ngược lại với đa số.
Bạn nghĩ rằng vấn đề của Lido là phí staking? Sai. Vấn đề thực sự là sự bão hòa dữ liệu blob của rollup sau Dencun.
Nghe có vẻ lạc đề? Hãy để tôi giải thích.
Sau Dencun, rollup sẽ gửi dữ liệu đến blob thay vì calldata. Điều này giảm phí gas cho rollup tạm thời. Nhưng giới hạn blob là hữu hạn. Trong vòng hai năm, dữ liệu blob sẽ bão hòa. Khi đó, phí gas cho mọi rollup sẽ tăng gấp đôi.
Và Lido, với tư cách là giao thức staking lớn nhất, sẽ bị ảnh hưởng trực tiếp. Họ quản lý hơn 8 triệu ETH staked. Khi phí gas tăng, việc tính toán phần thưởng staking trở nên tốn kém hơn. Các hợp đồng thông minh của họ phải thực hiện nhiều phép tính số học phức tạp hơn.
Điểm mấu chốt: lỗ hổng trong StakingRouter.sol không phải là lỗi của lập trình viên, mà là hậu quả của một kiến trúc được thiết kế trong thời đại gas rẻ, không thể chịu được chi phí trong thời đại blob bão hòa.
Đa số sẽ nói: "Chỉ là tăng phí nhỏ, không sao."
Nhưng tôi nói: "Đây là dấu hiệu đầu tiên của một cuộc khủng hoảng quản trị. Khi blob bão hòa, phí gas tăng, và những lỗ hổng nhỏ sẽ trở thành thảm họa."
Takeaway
Tôi từng thấy một dự án DeFi sụp đổ chỉ vì một lỗi uint256 overflow. Tôi từng thấy một DAO tan rã vì không thể đồng thuận về một tham số cơ bản.
57% vs 43% không phải là một quyết định dân chủ. Đó là một lời cảnh báo. Nó cho thấy cộng đồng Lido đang chia rẽ, và mỗi bên đều có lý do kỹ thuật của mình.
Hãy tự hỏi: bạn có tin vào con số 57% không? Hay bạn biết đọc mã nguồn?
Vì trong thị trường tăng này, khi ai cũng FOMO mua stETH, chính những phân tích kỹ thuật như thế này mới giúp bạn sống sót qua đợt sóng tiếp theo.