في برمجة العقود الذكية، تعتبر مشكلة دقة الحسابات العددية مهمة بشكل خاص. ستتناول هذه المقالة المشكلات الشائعة في الحسابات العددية في عقود Rust الذكية وحلولها.
1. مشكلة دقة العمليات العددية العشرية
تدعم لغة Rust العمليات الحسابية العائمة بشكل أصلي، لكن هناك مشكلة لا مفر منها في دقة الحسابات عند استخدام العمليات العائمة. عند التعامل مع النسب أو أسعار الفائدة التي تنطوي على قرارات اقتصادية/مالية هامة، لا يُوصى باستخدام العمليات الحسابية العائمة.
تتبع نوع النقطة العائمة المزدوجة f64 في لغة Rust معيار IEEE 754، حيث يتم تمثيله بصيغة العد العلمي ذات الأساس 2. بعض الأعداد العشرية مثل ( مثل 0.7) لا يمكن تمثيلها بدقة باستخدام عدد محدود من المنازل العائمة، مما يؤدي إلى ظاهرة "التقريب".
على سبيل المثال، عند توزيع 0.7 من رموز NEAR على 10 مستخدمين على سلسلة بلوكشين NEAR:
القيمة الفعلية لمبلغ amount هي 0.69999999999999995559، ونتيجة result_0 هي 0.06999999999999999، وليس 0.07 كما كان متوقعًا.
لحل هذه المشكلة، يمكن النظر في استخدام تمثيل الأعداد العشرية. في بروتوكول NEAR، يتم عادةً استخدام 10^24 ككسر، أي 1 NEAR = 10^24 yoctoNEAR. الطريقة المعدلة للحساب هي كما يلي:
بهذه الطريقة يمكن الحصول على نتائج حسابية دقيقة: 0.7 NEAR / 10 = 0.07 NEAR.
!
2. مشكلة دقة حسابات الأعداد الصحيحة في Rust
على الرغم من أن استخدام الحسابات الصحيحة يمكن أن يحل بعض مشكلات دقة الأعداد العشرية في بعض السيناريوهات، إلا أن هناك بعض العوامل التي تؤثر على دقة الحسابات.
2.1 ترتيب العمليات
قد يؤثر تغيير الترتيب في العمليات الحسابية التي لها أولوية متساوية مثل الضرب والقسمة بشكل مباشر على نتيجة الحساب. على سبيل المثال:
يمكن لهذه الطريقة تعويض خسارة الدقة تدريجياً في التوزيع متعدد الجولات.
3.4 استخدام مكتبة Rust Crate rust-decimal
تستخدم هذه المكتبة في الحسابات المالية العشرية التي تتطلب دقة حسابية فعالة ولا تحتوي على أخطاء تقريب.
3.5 النظر في آلية التقريب
عند تصميم العقود الذكية، عادةً ما تتبع مشكلة التقريب مبدأ "أريد الاستفادة ولا ينبغي للآخرين استغلالي". اختر التقريب لأدنى أو لأعلى أو التقريب العادي حسب الحالة.
من خلال اعتماد هذه الطرق، يمكن تحسين دقة وموثوقية الحسابات العددية في العقود الذكية بلغة Rust بشكل كبير.
This page may contain third-party content, which is provided for information purposes only (not representations/warranties) and should not be considered as an endorsement of its views by Gate, nor as financial or professional advice. See Disclaimer for details.
تسجيلات الإعجاب 7
أعجبني
7
3
مشاركة
تعليق
0/400
MaticHoleFiller
· منذ 17 س
تضيع الوقت طوال اليوم بسبب مشكلة الدقة
شاهد النسخة الأصليةرد0
StablecoinAnxiety
· منذ 17 س
مرة أخرى، تتطلب الخوارزمية والمالية، الأمر صعب قليلاً~
شاهد النسخة الأصليةرد0
GhostAddressMiner
· منذ 17 س
مثال نموذجي آخر لإلقاء اللوم على المعايير بسبب مشكلة دقة، دون أن يعرف في الخفاء كم من الأموال تم تحويلها إلى نقد، البيانات داخل السلسلة لا تكذب.
Rust العقود الذكية عدد دقيق: دليل تجنب المشاكل وأفضل الممارسات
Rust العقود الذكية中的数值精算
في برمجة العقود الذكية، تعتبر مشكلة دقة الحسابات العددية مهمة بشكل خاص. ستتناول هذه المقالة المشكلات الشائعة في الحسابات العددية في عقود Rust الذكية وحلولها.
1. مشكلة دقة العمليات العددية العشرية
تدعم لغة Rust العمليات الحسابية العائمة بشكل أصلي، لكن هناك مشكلة لا مفر منها في دقة الحسابات عند استخدام العمليات العائمة. عند التعامل مع النسب أو أسعار الفائدة التي تنطوي على قرارات اقتصادية/مالية هامة، لا يُوصى باستخدام العمليات الحسابية العائمة.
تتبع نوع النقطة العائمة المزدوجة f64 في لغة Rust معيار IEEE 754، حيث يتم تمثيله بصيغة العد العلمي ذات الأساس 2. بعض الأعداد العشرية مثل ( مثل 0.7) لا يمكن تمثيلها بدقة باستخدام عدد محدود من المنازل العائمة، مما يؤدي إلى ظاهرة "التقريب".
على سبيل المثال، عند توزيع 0.7 من رموز NEAR على 10 مستخدمين على سلسلة بلوكشين NEAR:
صدأ دع المبلغ: F64 = 0.7 ؛
دع المقسوم عليه: f64 = 10.0; دع result_0 = الكمية / القاسم ؛
القيمة الفعلية لمبلغ amount هي 0.69999999999999995559، ونتيجة result_0 هي 0.06999999999999999، وليس 0.07 كما كان متوقعًا.
لحل هذه المشكلة، يمكن النظر في استخدام تمثيل الأعداد العشرية. في بروتوكول NEAR، يتم عادةً استخدام 10^24 ككسر، أي 1 NEAR = 10^24 yoctoNEAR. الطريقة المعدلة للحساب هي كما يلي:
صدأ دع N: u128 = 1_000_000_000_000_000_000_000_000; المبلغ اليدخ: U128 = 700_000_000_000_000_000_000_000 ؛ دع المقسوم: U128 = 10 ؛
دع result_0 = الكمية / القاسم ؛
بهذه الطريقة يمكن الحصول على نتائج حسابية دقيقة: 0.7 NEAR / 10 = 0.07 NEAR.
!
2. مشكلة دقة حسابات الأعداد الصحيحة في Rust
على الرغم من أن استخدام الحسابات الصحيحة يمكن أن يحل بعض مشكلات دقة الأعداد العشرية في بعض السيناريوهات، إلا أن هناك بعض العوامل التي تؤثر على دقة الحسابات.
2.1 ترتيب العمليات
قد يؤثر تغيير الترتيب في العمليات الحسابية التي لها أولوية متساوية مثل الضرب والقسمة بشكل مباشر على نتيجة الحساب. على سبيل المثال:
صدأ دع أ: U128 = 1_0000 ؛ دع ب: U128 = 10_0000 ؛ دع C: U128 = 20 ؛
result_0 = أ * ج / ب دع result_0 = a.checked_mul(c).expect( "ERR_MUL").checked_ div(b).expect( "ERR_DIV" );
result_1 = أ / ب * ج دع result_1 = a.checked_div(b).expect("ERR_DIV").checked_ mul(c).expect( "ERR_MUL" );
الناتج_0 و الناتج_1 مختلفان في النتائج الحسابية، والسبب هو أن قسمة الأعداد الصحيحة تتجاهل الدقة التي تقل عن المقام.
2.2 حجم صغير جداً
عند التعامل مع حسابات بمقادير صغيرة، قد يؤدي ذلك أيضًا إلى مشاكل في الدقة:
صدأ دع أ: u128 = 10 ؛ دع ب: u128 = 3 ؛ دع C: U128 = 4 ؛ دع الرقم العشري: U128 = 100_0000 ؛
result_0 = (a / b) * ج دع result_0 = a.checked_div(b).expect("ERR_DIV").checked_ mul(c).expect( "ERR_MUL" );
result_1 = (a * عشري / b) * ج / عشري ؛
دع result_1 = a.checked_mul(decimal).expect("ERR_MUL") .checked_div(b).expect("ERR_DIV") .checked_mul(c).expect("ERR_MUL") .checked_div(decimal).expect("ERR_DIV");
نتيجة result_0 و result_1 مختلفة، و result_1 أقرب إلى القيمة المتوقعة الفعلية.
!
3. كيفية كتابة العقود الذكية Rust الخاصة بالتقييم العددي
لزيادة دقة حسابات الأرقام في العقود الذكية Rust، يمكن اتخاذ التدابير التالية:
3.1 تعديل ترتيب عمليات الحساب
اجعل الضرب بين الأعداد الصحيحة له الأولوية على القسمة بين الأعداد الصحيحة.
3.2 زيادة مرتبة العدد الصحيح
استخدام مقاييس أكبر لإنشاء جزيئات أكبر، وزيادة دقة العمليات.
3.3 فقدان دقة العمليات التراكمية
بالنسبة لمشكلة دقة الحسابات الصحيحة التي لا مفر منها، يمكن اعتبار تسجيل فقدان دقة العمليات التراكمية. على سبيل المثال:
صدأ كونست USER_NUM: U128 = 3 ؛
الجبهة distribute(amount: U128 ، الإزاحة: u128) -> U128 { دع token_to_distribute = الإزاحة + المبلغ ؛ دع per_user_share = token_to_distribute / USER_NUM ؛ دع recorded_offset = token_to_distribute - per_user_share * USER_NUM ؛ recorded_offset }
يمكن لهذه الطريقة تعويض خسارة الدقة تدريجياً في التوزيع متعدد الجولات.
3.4 استخدام مكتبة Rust Crate rust-decimal
تستخدم هذه المكتبة في الحسابات المالية العشرية التي تتطلب دقة حسابية فعالة ولا تحتوي على أخطاء تقريب.
3.5 النظر في آلية التقريب
عند تصميم العقود الذكية، عادةً ما تتبع مشكلة التقريب مبدأ "أريد الاستفادة ولا ينبغي للآخرين استغلالي". اختر التقريب لأدنى أو لأعلى أو التقريب العادي حسب الحالة.
من خلال اعتماد هذه الطرق، يمكن تحسين دقة وموثوقية الحسابات العددية في العقود الذكية بلغة Rust بشكل كبير.
!