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.
13 Suka
Hadiah
13
8
Posting ulang
Bagikan
Komentar
0/400
SeasonedInvestor
· 07-19 12:17
Ketepatan memang menjengkelkan
Lihat AsliBalas0
RugPullProphet
· 07-18 09:14
Pengendalian akurasi harus tepat
Lihat AsliBalas0
GasOptimizer
· 07-16 19:00
Ketepatan adalah kehidupan
Lihat AsliBalas0
TestnetScholar
· 07-16 18:56
Menghitung dengan bilangan bulat lebih dapat diandalkan
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.