Hợp đồng có thể đúng và lệnh gọi DuskVM của tôi vẫn có thể chết chỉ vì hai ký tự.

Các đầu vào của DuskVM không được gửi dưới dạng JSON đọc được. Chúng là các byte được mã hóa theo kiểu rkyv, và Forge sử dụng trình điều khiển dữ liệu off-chain của hợp đồng để biến một thứ giống như 42 của con người thành các byte mà hợp đồng thực sự mong đợi.

Phần khó ở đây là khâu bàn giao. Forge đưa cho tôi giá trị được mã hóa đó dưới dạng hex có tiền tố 0x. Một SDK có thể muốn giữ nguyên tiền tố đó. Rusk Wallet’s --fn-args yêu cầu tôi phải xóa nó.

Vì vậy tôi có thể kiểm thử logic hợp đồng, xác minh WASM, mã hóa đúng tham số, rồi làm hỏng lệnh gọi trực tiếp bằng cách truyền chính xác các byte đó nhưng ở dạng “transport” sai.

Đó là lỗi tích hợp mà tôi sẽ cẩn trọng nhất. Không phải vì nó kịch tính, mà vì mọi thứ phía trên có vẻ hoàn toàn ổn. Hàm tồn tại. Schema đúng. Giá trị đúng. Sự thất bại nằm ở ranh giới giữa trình điều khiển dữ liệu và bên gửi.

Nếu tôi đang xây dựng một ứng dụng DuskVM, tôi sẽ chuẩn hóa các đối số khi gọi một lần và kiểm thử ranh giới đó với mọi đường dẫn gửi (submission) mà tôi hỗ trợ.

Hai ký tự không bao giờ nên là lý do khiến một hành động hợp đồng hợp lệ trở thành một giao dịch thất bại của người dùng.

#dusk $DUSK @Dusk