Lompat ke konten

Ketidakcocokan desimal oracle

Ketidakcocokan desimal menerapkan skala unit yang salah pada jawaban oracle, jumlah token, kurs wrapper, atau nilai protokol sehingga menimbulkan kesalahan beberapa orde magnitudo pada pinjaman, pencetakan, penebusan, dan likuidasi.

Diperbarui

Hanya untuk tujuan edukasi; bukan merupakan nasihat investasi atau rekomendasi investasi. Investasi dapat mengakibatkan kerugian.

Jawaban langsung

Ketidakcocokan desimal oracle terjadi ketika kontrak menafsirkan bilangan bulat mentah dengan eksponen unit, arah harga, atau skala internal yang salah. Desimal umpan, token, dan token kuotasi, skala kurs wrapper atau saham, serta konvensi WAD atau RAY protokol saling independen. Tampilan frontend yang terlihat benar tidak membuktikan bahwa kontrak konsumen melakukan aritmetika yang sama.

Untuk jumlah token dasar A_raw dengan d_t desimal dan jawaban umpan positif P_raw yang mengutip satu token dasar dalam token kuotasi dengan d_p desimal, jumlah mentah token kuotasi dengan d_q desimal adalah V_raw = round(A_raw * P_raw * 10^d_q / 10^(d_t + d_p)). Rumus ini hanya berlaku untuk arah kuotasi yang dinyatakan dan setelah umpan, unit, tipe, serta aturan pembulatan divalidasi. Nilai yang sudah dinormalisasi adaptor tidak boleh diskalakan lagi.

ERC-20 decimals() merupakan metadata tampilan opsional, bukan jaminan universal 18 desimal. Fungsi decimals() umpan menjelaskan respons umpan tersebut, bukan skala token atau protokol. Aritmetika terperiksa dapat menghentikan overflow dengan revert, tetapi tidak dapat mendeteksi rumus yang salah secara dimensional dan dapat mengubah hasil akhir yang sebenarnya dapat direpresentasikan menjadi penolakan layanan jika produk antara overflow.

Cara kerjanya

  1. Tetapkan chain, blok, konsumen, adaptor, proksi dan agregator umpan, token atau vault, versi compiler dan pustaka matematika, serta status upgrade.
  2. Inventarisasikan setiap bilangan bulat beserta tipe dan unitnya: jumlah token mentah, desimal token, jawaban umpan bertanda, desimal umpan, arah aset dasar dan kuotasi, kurs wrapper atau saham, skala internal protokol, serta desimal token keluaran.
  3. Validasi sumber sebelum konversi: alamat dan arah yang benar, jawaban positif, cap waktu dan status, usia dan rentang yang dapat diterima, semantik sumber cadangan, serta aturan masa tenggang sequencer L2 jika berlaku.
  4. Turunkan satu rumus dimensional dari unit mentah masukan ke unit mentah keluaran. Buat cabang eksplisit saat menaikkan atau menurunkan skala, batasi setiap eksponen pangkat sepuluh, dan normalisasi setiap komponen tepat satu kali.
  5. Gunakan operasi kali-bagi presisi penuh yang telah terbukti atau strategi pencoretan yang terikat. Hindari pemotongan akibat membagi sebelum mengalikan, overflow produk antara terperiksa, wraparound tak terperiksa, dan cast bertanda atau lebih sempit yang tidak aman.
  6. Tetapkan pembulatan ke bawah, ke atas, atau terdekat untuk setiap tindakan ekonomi. Agunan, utang, pinjaman, pencetakan, penebusan, biaya, likuidasi, dan konversi saham vault mungkin memerlukan arah konservatif yang berbeda.
  7. Uji vektor acuan dan properti pada jumlah ekstrem, kombinasi desimal, harga resiprokal, umpan komposit, jawaban nol, negatif dan kedaluwarsa, upgrade, serta dust; rekonsiliasi hasil onchain dengan model presisi tinggi independen dan batasi eksposur yang terdampak.

Normalisasi adalah analisis dimensi, bukan pemformatan. BTC/USD dan USD/BTC membutuhkan rumus resiprokal; mengubah label tidak membalik harga. Umpan komposit memerlukan skala dan cap waktu setiap komponen. Pembagian bilangan bulat Solidity memotong menuju nol, sehingga penyusunan ulang yang setara secara aljabar dapat memberi hasil onchain berbeda. mulDiv presisi penuh memecahkan masalah lebar produk antara, tetapi pemanggil tetap harus memberikan pembilang, penyebut, unit, batas, dan arah pembulatan yang benar.

Contoh perhitungan

  • Delapan dibanding delapan belas desimal. Umpan BTC/USD mengembalikan 6,000,000,000,000 dengan d_p = 8, sehingga harganya 60,000 USD/BTC. Menafsirkan jawaban mentah sebagai 18 desimal menghasilkan 0.000006 USD/BTC, undervaluasi sebesar 10^10, bukan 10^9. Menskalakan harga ke WAD menghasilkan 6,000,000,000,000 * 10^(18 - 8) = 60,000,000,000,000,000,000,000.
  • Unit jumlah, harga, dan keluaran. A_raw = 2,500,000 mewakili 2.5 token pada d_t = 6; P_raw = 200,000,000 mewakili 2 token kuotasi pada d_p = 8. Untuk nilai kuotasi internal 18 desimal, 2,500,000 * 200,000,000 * 10^18 / 10^(6 + 8) = 5,000,000,000,000,000,000, atau 5 quote tokens. Menghilangkan penyebut token menilai posisi terlalu tinggi sebesar 10^6.
  • Resiprokal dan pemotongan. ETH/USD pada skala WAD adalah 2,000 * 10^18. USD/ETH pada skala yang sama adalah floor(10^36 / (2,000 * 10^18)) = 500,000,000,000,000, atau 0.0005 ETH/USD. Secara terpisah, dengan A_raw = 999,999, d_t = 6, dan harga 2 * 10^18, kali-bagi presisi penuh menghasilkan 1,999,998,000,000,000,000; membagi jumlah dengan 10^6 terlebih dahulu menghasilkan 0 dan menghilangkan seluruh nilai.
  • Overflow antara dan pembulatan. Misalkan x = 2^200, y = 2^100, dan penyebut 2^100. Hasil tepatnya 2^200, yang muat dalam uint256, tetapi x * y = 2^300 tidak muat. Perkalian terperiksa mengalami revert dan perkalian tak terperiksa mengalami wraparound; mulDiv presisi penuh mengembalikan 2^200. Pembagian bilangan bulat 5 / 2 membulatkan ke bawah menjadi 2, sedangkan aturan ceiling menghasilkan 3, sehingga pembulatan merupakan bagian dari invarian ekonomi.

Risiko

  • Chain, umpan, proksi, adaptor, token, vault, atau alamat konsumen salah.
  • Arah aset dasar dan kuotasi dibalik tanpa konversi resiprokal.
  • Desimal token diasumsikan 18 atau metadata opsional tidak tersedia maupun salah.
  • Desimal umpan diasumsikan 8 alih-alih dibaca dan ditetapkan.
  • Desimal token kuotasi dan skala WAD, RAY, pasar, atau akuntansi protokol tertukar.
  • Desimal wrapper, saham, indeks, atau kurs terlewat.
  • Faktor skala diterapkan dua kali setelah adaptor menormalisasi nilai.
  • Faktor skala atau penyebut yang diperlukan dihilangkan.
  • Jawaban bertanda di-cast menjadi tanpa tanda sebelum diperiksa positif.
  • Hasil umpan nol, kedaluwarsa, belum lengkap, dibatasi, atau tidak valid diterima.
  • Eksponen desimal atau perhitungan pangkat sepuluh mengalami underflow, overflow, atau melampaui batas.
  • Produk antara overflow walaupun hasil bagi akhir akan muat.
  • Aritmetika tak terperiksa, bit shift, atau penyempitan eksplisit diam-diam wraparound atau memotong nilai.
  • Pembagian sebelum perkalian menghancurkan presisi atau mengubah dust menjadi nol.
  • Pembulatan ke bawah, ke atas, atau terdekat salah untuk tindakan ekonomi.
  • Konversi berulang menumpuk kehilangan presisi atau kebocoran nilai sistematis.
  • Harga, batas, rasio, persentase, basis point, WAD, dan RAY dibandingkan dalam unit berbeda.
  • Upgrade umpan, token, proksi, adaptor, atau vault membatalkan asumsi desimal yang di-cache.
  • Pemformatan frontend, dompet, RPC, atau indexer menyembunyikan perhitungan onchain yang berbeda.
  • Salah valuasi memperbesar pinjaman, pencetakan, penebusan, likuidasi, batas, kredit macet, atau penerbitan saham yang tidak adil.

Kesalahpahaman umum

  • “Setiap token ERC-20 memakai 18 desimal.” Metode metadata ERC-20 bersifat opsional, dan aset yang sudah diterapkan memakai nilai serta perilaku berbeda.
  • “Setiap umpan harga USD memakai 8 desimal.” Presisi umpan adalah properti antarmuka deployment tertentu dan harus dibaca serta dicatat versinya.
  • “Bilangan bulat mentah yang besar membuktikan manipulasi.” Besaran mentah tidak bermakna tanpa unit, arah, desimal, cap waktu, dan skala konsumen.
  • “Solidity 0.8 membuat penskalaan benar.” Pemeriksaan overflow dapat melakukan revert, tetapi tidak memperbaiki unit keliru, pemotongan, cast, atau kebijakan pembulatan.
  • “Mengalikan sebelum membagi atau menambah desimal selalu meningkatkan akurasi.” Hal itu dapat menyebabkan overflow, skala ganda, atau mempertahankan unit yang salah; aritmetika presisi penuh tetap memerlukan rumus yang benar.

Topik terkait

Sumber

Navigasi

Cari di wiki...