Kỹ thuật tính toán số trong hợp đồng thông minh Rust: Tránh bẫy số dấu phẩy động

Nhật ký phát triển hợp đồng thông minh Rust (7) Tính toán số lượng

1. Vấn đề độ chính xác trong phép toán số thực

Khác với ngôn ngữ lập trình hợp đồng thông minh phổ biến Solidity, ngôn ngữ Rust hỗ trợ tính toán số thực một cách nguyên bản. Tuy nhiên, tính toán số thực tồn tại những vấn đề về độ chính xác không thể tránh khỏi. Do đó, khi viết hợp đồng thông minh, không nên khuyến khích sử dụng tính toán số thực, đặc biệt là khi xử lý các tỷ lệ hoặc lãi suất liên quan đến quyết định kinh tế hoặc tài chính quan trọng.

Hiện tại, hầu hết các ngôn ngữ lập trình chính thống đều tuân theo tiêu chuẩn IEEE 754 trong việc biểu diễn số thực, và ngôn ngữ Rust cũng không phải là ngoại lệ. Kiểu số thực đôi f64 được lưu trữ dưới dạng dữ liệu nhị phân trong máy tính.

Số thực được biểu diễn bằng cách sử dụng hệ thống số khoa học có cơ số là 2. Ví dụ, số nhị phân hữu hạn 0.1101 có thể được sử dụng để biểu diễn số thập phân 0.8125. Tuy nhiên, đối với số thập phân như 0.7, quá trình chuyển đổi sang số thực sẽ dẫn đến biểu diễn nhị phân tuần hoàn vô hạn, không thể được biểu diễn chính xác bằng số thực có độ dài hữu hạn, và sẽ xảy ra hiện tượng "làm tròn".

Giả sử cần phân phát 0.7 token cho mười người dùng, số lượng token mà mỗi người dùng nhận được sẽ được tính và lưu trong biến result_0. Sau khi thực hiện các trường hợp kiểm tra liên quan, chúng ta có thể thấy rằng giá trị của amount không chính xác thể hiện 0.7, mà là một giá trị gần đúng cực kỳ 0.69999999999999995559. Hơn nữa, đối với phép chia đơn giản amount/divisor, kết quả của phép toán cũng sẽ trở thành không chính xác là 0.06999999999999999, không phải là 0.07 như mong đợi. Do đó, có thể thấy sự không chắc chắn trong phép toán số thực.

Đối với điều này, chúng ta cần xem xét việc sử dụng các phương pháp biểu diễn số khác trong hợp đồng thông minh, chẳng hạn như số cố định. Trong việc viết hợp đồng thông minh thực tế, thường sẽ sử dụng một phân số có mẫu số cố định để biểu thị một giá trị nào đó, ví dụ phân số x/N, trong đó N là hằng số, x có thể thay đổi.

Trong một số blockchain công khai, giá trị thường gặp của N là 10^24, tức là 10^24 đơn vị nhỏ nhất tương đương với 1 đơn vị mã thông báo chính. Dựa trên điều này, chúng ta có thể chuyển đổi phép toán số thực thành phép toán số nguyên để có được kết quả tính toán chính xác hơn.

2. Vấn đề độ chính xác của phép tính số nguyên Rust

Sử dụng phép toán số nguyên có thể giải quyết vấn đề mất độ chính xác trong phép toán số thực trong một số trường hợp. Nhưng điều này không có nghĩa là kết quả của phép toán số nguyên hoàn toàn chính xác và đáng tin cậy. Một số nguyên nhân ảnh hưởng đến độ chính xác của phép toán số nguyên bao gồm:

2.1 thứ tự thực hiện

Thứ tự thực hiện phép nhân và phép chia có cùng độ ưu tiên có thể ảnh hưởng trực tiếp đến kết quả tính toán, dẫn đến vấn đề về độ chính xác của phép tính số nguyên. Đối với phép chia số nguyên, độ chính xác nhỏ hơn số chia sẽ bị bỏ đi. Do đó, trong một số quá trình tính toán, nếu thực hiện phép chia trước có thể dẫn đến mất độ chính xác.

2.2 quy mô quá nhỏ

Khi các giá trị liên quan quá nhỏ, phép toán số nguyên cũng có thể gặp vấn đề về độ chính xác. Chẳng hạn, trong một số trường hợp, việc thực hiện phép toán số nguyên trực tiếp và thực hiện phép toán sau khi đưa vào quy mô lớn hơn có thể cho ra kết quả khác nhau.

3. Cách viết hợp đồng thông minh Rust cho tính toán số

Để đảm bảo độ chính xác tính toán trong hợp đồng thông minh, có thể áp dụng các biện pháp bảo vệ sau:

3.1 Điều chỉnh thứ tự thực hiện phép toán

Cố gắng để phép nhân số nguyên ưu tiên hơn phép chia số nguyên.

3.2 Tăng số lượng cấp bậc của số nguyên

Sử dụng quy mô lớn hơn để biểu thị giá trị, tạo ra các phân số lớn hơn tham gia vào tính toán để nâng cao độ chính xác.

3.3 Mất mát độ chính xác của phép toán tích lũy

Đối với vấn đề độ chính xác số nguyên không thể tránh khỏi, có thể xem xét ghi lại tổn thất độ chính xác tích lũy. Trong các phép toán tiếp theo, sẽ tính đến những tổn thất này để đạt được phân phối kết quả công bằng hơn.

3.4 Sử dụng thư viện Rust Crate rust-decimal

Thư viện này phù hợp cho các tình huống tính toán tài chính với số thập phân cần độ chính xác cao và không có lỗi làm tròn.

3.5 Xem xét cơ chế làm tròn

Khi thiết kế hợp đồng thông minh, vấn đề làm tròn thường tuân theo nguyên tắc "có lợi cho mình, bất lợi cho người khác". Chọn cách làm tròn phù hợp như làm tròn xuống, làm tròn lên hoặc các cách làm tròn khác tùy theo tình huống cụ thể.

Bằng cách thực hiện những biện pháp này, có thể đạt được tính toán số liệu chính xác hơn trong hợp đồng thông minh Rust, tránh được những lỗi hoặc kết quả không công bằng do vấn đề độ chính xác.

Xem bản gốc
Trang này có thể chứa nội dung của bên thứ ba, được cung cấp chỉ nhằm mục đích thông tin (không phải là tuyên bố/bảo đảm) và không được coi là sự chứng thực cho quan điểm của Gate hoặc là lời khuyên về tài chính hoặc chuyên môn. Xem Tuyên bố từ chối trách nhiệm để biết chi tiết.
  • Phần thưởng
  • 8
  • Đăng lại
  • Chia sẻ
Bình luận
0/400
SeasonedInvestorvip
· 07-19 12:17
Độ chính xác thực sự làm khó người.
Xem bản gốcTrả lời0
RugPullProphetvip
· 07-18 09:14
Kiểm soát độ chính xác phải đúng chỗ.
Xem bản gốcTrả lời0
GasOptimizervip
· 07-16 19:00
Độ chính xác chính là sự sống
Xem bản gốcTrả lời0
TestnetScholarvip
· 07-16 18:56
Đi đến số nguyên thì đáng tin cậy hơn
Xem bản gốcTrả lời0
GasFeeBarbecuevip
· 07-16 18:46
Tỷ lệ nhân với 10000
Xem bản gốcTrả lời0
GweiWatchervip
· 07-16 18:46
Độ chính xác có quá nhiều vấn đề.
Xem bản gốcTrả lời0
MetaverseHermitvip
· 07-16 18:32
Quyết định tính toán sinh tử môn
Xem bản gốcTrả lời0
BlockchainBardvip
· 07-16 18:31
Vấn đề độ chính xác đáng được theo dõi
Xem bản gốcTrả lời0
Giao dịch tiền điện tử mọi lúc mọi nơi
qrCode
Quét để tải xuống ứng dụng Gate
Cộng đồng
Tiếng Việt
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)