Teknik perhitungan nilai dalam smart contract Rust: menghindari jebakan angka desimal

Rust smart contract pengembangan jurnal (7) perhitungan nilai

1. Masalah presisi dalam operasi bilangan floating point

Berbeda dengan bahasa pemrograman kontrak pintar yang umum, Solidity, bahasa Rust mendukung operasi angka pecahan secara native. Namun, operasi angka pecahan memiliki masalah presisi perhitungan yang tidak dapat dihindari. Oleh karena itu, saat menulis kontrak pintar, tidak disarankan untuk menggunakan operasi angka pecahan, terutama ketika menangani rasio atau suku bunga yang melibatkan keputusan ekonomi atau keuangan yang penting.

Saat ini, sebagian besar bahasa pemrograman utama yang merepresentasikan angka titik mengambang mengikuti standar IEEE 754, dan bahasa Rust tidak terkecuali. Tipe titik mengambang presisi ganda f64 disimpan dalam bentuk data biner di dalam komputer.

Bilangan floating-point menggunakan notasi ilmiah dengan basis 2 untuk diekspresikan. Misalnya, bilangan biner 0.1101 dengan jumlah digit terbatas dapat digunakan untuk merepresentasikan desimal 0.8125. Namun, untuk desimal seperti 0.7, proses konversinya menjadi bilangan floating-point akan menghasilkan representasi biner yang berulang tanpa henti, sehingga tidak dapat diwakili secara akurat dengan bilangan floating-point yang memiliki panjang terbatas, dan terdapat fenomena "pembulatan".

Misalkan perlu mendistribusikan 0,7 token kepada sepuluh pengguna, jumlah token yang diterima masing-masing pengguna akan dihitung dan disimpan dalam variabel result_0. Setelah mengeksekusi kasus uji terkait, kita dapat menemukan bahwa nilai amount tidak secara akurat merepresentasikan 0,7, melainkan nilai yang sangat mendekati 0,69999999999999995559. Lebih lanjut, untuk operasi pembagian tunggal amount/divisor, hasil operasinya juga akan menjadi tidak akurat 0,06999999999999999, bukan 0,07 yang diharapkan. Dari sini dapat dilihat ketidakpastian dalam operasi angka desimal.

Oleh karena itu, kita perlu mempertimbangkan untuk menggunakan metode representasi numerik lainnya dalam smart contract, seperti bilangan tetap. Dalam penulisan smart contract yang sebenarnya, biasanya akan digunakan fraksi dengan penyebut tetap untuk mewakili suatu nilai, misalnya fraksi x/N, di mana N adalah konstanta, dan x dapat bervariasi.

Dalam beberapa blockchain publik, nilai N yang umum adalah 10^24, yaitu 10^24 unit terkecil setara dengan 1 unit token utama. Berdasarkan hal ini, kita dapat mengubah perhitungan bilangan desimal menjadi perhitungan bilangan bulat untuk mendapatkan hasil perhitungan yang lebih akurat.

2. Masalah Presisi Perhitungan Integer Rust

Menggunakan perhitungan bilangan bulat dapat menyelesaikan masalah kehilangan presisi perhitungan bilangan pecahan dalam beberapa skenario. Namun, ini tidak berarti bahwa hasil perhitungan bilangan bulat sepenuhnya akurat dan dapat diandalkan. Beberapa penyebab yang memengaruhi presisi perhitungan bilangan bulat meliputi:

2.1 Urutan operasi

Urutan operasi perkalian dan pembagian dengan prioritas aritmatika yang sama dapat secara langsung mempengaruhi hasil perhitungan, yang mengakibatkan masalah presisi dalam perhitungan bilangan bulat. Untuk pembagian bilangan bulat, presisi yang kurang dari pembagi akan diabaikan. Oleh karena itu, dalam beberapa proses perhitungan, jika pembagian dilakukan terlebih dahulu, mungkin akan menyebabkan kehilangan presisi.

2.2 skala yang terlalu kecil

Ketika nilai yang terlibat terlalu kecil, operasi bilangan bulat juga dapat mengalami masalah presisi. Misalnya, dalam beberapa kasus, melakukan operasi bilangan bulat secara langsung dan melakukan operasi setelah memperkenalkan urutan besar yang lebih tinggi dapat menghasilkan hasil yang berbeda.

3. Bagaimana Menulis Smart Contract Rust untuk Aktuaria Numerik

Untuk memastikan akurasi perhitungan dalam smart contract, langkah-langkah perlindungan berikut dapat diambil:

3.1 Mengatur urutan operasi perhitungan

Usahakan untuk melakukan perkalian bilangan bulat sebelum pembagian bilangan bulat.

3.2 Meningkatkan urutan angka bulat

Gunakan skala yang lebih besar untuk mewakili nilai, menciptakan numerator yang lebih besar untuk berpartisipasi dalam perhitungan, untuk meningkatkan akurasi.

3.3 Kerugian Akumulasi Presisi Operasi

Untuk masalah presisi perhitungan integer yang tidak dapat dihindari, dapat dipertimbangkan untuk mencatat akumulasi kehilangan presisi operasi. Dalam perhitungan selanjutnya, kerugian ini harus diperhitungkan untuk mencapai distribusi hasil yang lebih adil.

3.4 Menggunakan pustaka Rust Crate rust-decimal

Perpustakaan ini cocok untuk skenario perhitungan keuangan desimal yang memerlukan perhitungan presisi tinggi dan tanpa kesalahan pembulatan.

3.5 Pertimbangkan mekanisme pembulatan

Dalam merancang smart contract, masalah pembulatan biasanya mengikuti prinsip "menguntungkan diri sendiri, merugikan orang lain". Pilih pembulatan ke bawah, pembulatan ke atas, atau metode pembulatan lain yang sesuai berdasarkan situasi spesifik.

Dengan mengambil langkah-langkah ini, perhitungan numerik yang lebih akurat dapat dicapai dalam kontrak pintar Rust, menghindari kesalahan atau hasil yang tidak adil akibat masalah presisi.

Lihat Asli
Halaman ini mungkin berisi konten pihak ketiga, yang disediakan untuk tujuan informasi saja (bukan pernyataan/jaminan) dan tidak boleh dianggap sebagai dukungan terhadap pandangannya oleh Gate, atau sebagai nasihat keuangan atau profesional. Lihat Penafian untuk detailnya.
  • Hadiah
  • 8
  • Posting ulang
  • Bagikan
Komentar
0/400
SeasonedInvestorvip
· 07-19 12:17
Ketepatan memang menjengkelkan
Lihat AsliBalas0
RugPullProphetvip
· 07-18 09:14
Pengendalian akurasi harus tepat
Lihat AsliBalas0
GasOptimizervip
· 07-16 19:00
Ketepatan adalah kehidupan
Lihat AsliBalas0
TestnetScholarvip
· 07-16 18:56
Menghitung dengan bilangan bulat lebih dapat diandalkan
Lihat AsliBalas0
GasFeeBarbecuevip
· 07-16 18:46
Rasio dikalikan 10000
Lihat AsliBalas0
GweiWatchervip
· 07-16 18:46
Terlalu banyak lubang ketepatan.
Lihat AsliBalas0
MetaverseHermitvip
· 07-16 18:32
Akurasi menentukan pintu hidup dan mati
Lihat AsliBalas0
BlockchainBardvip
· 07-16 18:31
Masalah akurasi perlu diikuti
Lihat AsliBalas0
  • Sematkan
Perdagangkan Kripto Di Mana Saja Kapan Saja
qrCode
Pindai untuk mengunduh aplikasi Gate
Komunitas
Bahasa Indonesia
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)