لم أتمكن من إرسال معاملة من خلال cardano-submit-api ، فقد قال "WithdrawalsNotInRewardsDELEGS" ، مما يعني ضمنيًا الحصول على مكافآت خاطئة ، أو محاولة سحب ليس كل المكافآت. لقد تحققت من جميع الأجزاء ، حيث كان من الممكن أن يحدث خطأ. بعد ذلك ، قارنت المكافآت مقابل العناوين العشوائية التي تم الحصول عليها من db-sync ومن yoroi api. هذه هي أوجه عدم التطابق لبعض (في أربطة الحب):
يمثل كل صف مكافآت db-sync من SQL هذا:
SELECT
(SELECT COALESCE(SUM(rewards.amount), 0) FROM
(
SELECT amount FROM reward WHERE addr_id=$1
UNION ALL
SELECT amount FROM reserve WHERE addr_id=$1
) rewards
) - (
SELECT COALESCE(SUM(amount), 0) FROM withdrawal WHERE addr_id=$1
)
AS "remainingRewards"
ناقص المكافآت من yoroi api.
ماذا يحدث @ erikd ؟
تحرير: yoroi يحصل عليه أيضًا من db-sync ، لذلك من المحتمل أن تكون هذه الاختلافات من قيمتين خاطئتين. في كلتا الحالتين ، ينشأ الخطأ في db-sync
لقد لاحظنا هذا أيضًا في Yoroi
فيما يلي نتائج 7 حالات مختلفة من cardano-db-sync حيث القيمة الحقيقية هي 30428426
backend#1 30428424
backend#2 30428424
backend#3 30428424
backend#4 30428423
backend#5 30428430
backend#6 30428424
backend#7 30428426
كما ترى ، فقط 1/7 الخلفية حصلت على النتيجة الصحيحة
لقد تحققنا مرة أخرى من تخزين هذه القيم غير الصحيحة في قاعدة بيانات SQL ، لذلك نعلم أن هذه المشكلة ليست في الجزء الخاص بنا من المكدس
تضمين التغريدة حالات مختلفة db-sync
تعطي نتائج مختلفة ؟؟؟ هل جميعهم يشغلون نفس الإصدار؟
xdzurman هل ستتمكن من تبسيط استعلام SQL هذا؟ سيكون من الجيد أن يكون لديك ثلاثة أعمدة ، المكافأة ، والاحتياطي ، والفرق.
أظن أن الاستعلام خاطئ بالفعل. يبدو جدول المكافآت على النحو التالي (لم تتم مزامنة المثيل الخاص بي حاليًا):
cexplorer=# select * from reward ;
id | addr_id | amount | epoch_no | pool_id | block_id
----+---------+--------+----------+---------+----------
(0 rows)
لذلك لكل حقبة مبلغ مكافأة (أي لقطة سريعة لمكافآت الحقبة) وبدون استكشافها بشكل صحيح ، لست متأكدًا مما هو موجود في جدول reserve
.
erikd هذا هو الاستعلام الذي قمنا بتشغيله على الخلفيات السبعة المختلفة التي أعطت نتائج مختلفة. كلهم نفس إصدار cardano-db-sync ونفس إصدار العقدة
select stake_address.hash_raw as "stakeAddress"
, "totalReward".*
from stake_address
left outer join (
SELECT addr_id, amount
FROM reward
) as "totalReward" on stake_address.id = "totalReward".addr_id
where encode(stake_address.hash_raw, 'hex') = 'e1567298bc998d188d936f105f9e9e616f1980adacc06fc5732a57f9cc'
لقد حصل العنوان المحدد في استعلام SQL هذا على مكافآت مرة واحدة فقط لذا يسهل التعامل معه.
أظن أن الاستعلام خاطئ بالفعل. يبدو جدول المكافآت على النحو التالي (لم تتم مزامنة المثيل الخاص بي حاليًا):
cexplorer=# select * from reward ; id | addr_id | amount | epoch_no | pool_id | block_id ----+---------+--------+----------+---------+---------- (0 rows)
لذلك لكل حقبة مبلغ مكافأة (أي لقطة سريعة لمكافآت الحقبة) وبدون استكشافها بشكل صحيح ، لست متأكدًا مما هو موجود في جدول
reserve
.
أفترض أن - الاحتياطي يحمل مكافآت ITN. يحدد جدول المكافآت المكافآت المستلمة في بداية تلك الحقبة. لذا فإن المكافآت المتبقية هي مجموع كل المكافآت والمكافآت مطروحًا منها عمليات السحب.
اكتشفنا مشاكل مماثلة. 137 مندوباً قد سحبوا بالضبط 500 ADA. يظهر داخل db-sync db في سحب الجدول. حصل بعضهم على رصيد سلبي بعد ذلك. إما أن يكون هذا مرتبطًا بهذه المشكلة أو أننا نفعل شيئًا خاطئًا من جانبنا.
فمثلا:
قام أحدهم بسحب 500 ADA ولكن حصل فقط على 200 ADA وفقًا لـ db-sync. المثال الخاص بي هو لـ Epoche عند أو بعد 214
هل https://github.com/input-output-hk/cardano-db-sync/pull/413 يصلح هذا أيضًا؟
mmahut لست متأكدا. قد يكون الخطأ الذي تم إصلاحه على # 413 قد تسبب بسهولة في حدوث هذه المشكلة أيضًا. أو قد يكون هناك أكثر من مشكلة واحدة. xdzurman ؟
mmahut هذا عبر حالات منفصلة؟ أحتاج إلى طريقة سهلة لإنتاج هذا وامتلاك أكثر من حالة واحدة ليست حالة استنساخ سهلة.
آسف ، لقد أطلقت عليه قبل الأوان. يبدو أن المشكلة قد تم إصلاحها ، وأنا أراقبها وسأقدم تقريرًا في غضون أيام قليلة.
يبدو أنه تم إصلاحه بالنسبة لي أيضًا ، وسيغلق الآن. لا تتردد في إعادة الفتح في حالة حدوث أي مشاكل.
التعليق الأكثر فائدة
آسف ، لقد أطلقت عليه قبل الأوان. يبدو أن المشكلة قد تم إصلاحها ، وأنا أراقبها وسأقدم تقريرًا في غضون أيام قليلة.