[پیشنهاد]: اعلام زمان سرور
نیازمندی
پاسخ های دریافت شده از api نوبیتکس دارای برچسب زمانی (timestamp) نیستند. این امر موجب میشود که نیاز باشد پاسخ های دریافت شده از سرور توسط مشتری به روشی که مشتری بایستی پیاده سازی کند، به این معنی که تقدم و تاخر هر پاسخ به چگونه است مرتب شوند. با پیاده سازی ترتیب منطقی در سمت مشتری، تنها ممکن است بتوان در برخی موارد ترتیب جزئی (partial ordering) ایجاد کرد. با این وجود، در موارد زیادی ایجاد همان ترتیب جزئی هم غیر ممکن است و تقدم وقوع رخدادها نامشخص است. چنین ابهامی، تصمیم گیری انجام معاملات را در سیستم مالی با اهمیت در سطح نوبیتکس را دشوار کرده و کاربر را در معرض زیان قرار میدهد.
مثال: فراخوانی تابع /market/orders/list فهرست سفارشات کاربر را ارائه میکند. در دو فراخوانی پیاپی از این تابع، اگر پاسخ اولین فراخوانی با تاخیر و پس از پاسخ دومین فراخوانی به دست مشتری برسد و محتوای پاسخ این دو فراخوانی باهم متفاوت باشند، تصمیم پذیری در مورد این که محتوای کدام یک از پاسخ ها در سمت سرور پس از دیگری ایجاد شده، غیر ممکن است. به عبارت دیگر نمیدانیم کدامیک از پاسخ ها بروزتر و قابل استناد است.
راهحل
راه حل ساده و مشخص برای ایجاد ترتیب فراگیر (total ordering) قرار دادن برچسب زمانی (timestamp) توسط سرور نوبیتکس در پاسخ به تمامی درخواست های مشتری است. در حال حاضر سرور مقدار status که موفقیت یا عدم موفقیت اجرای درخواست است را صرف نظر از محتوا و نوع درخواست در محتوای پاسخ میگنجاند. به طریق مشابه، سرور بایستی مقدار timestamp را در محتوای تمامی پاسخ های ارسال به مشتری ارسال نماید.
- مقدار timestamp بایستی معادل ساعت سرور (server time) در زمان تهیه پاسخ به درخواست باشد.
- از آنجایی که در سمت مشتری، مقدار timestamp دو پاسخ باهم قیاس میشوند، بهتر است ساختار آن Unix Timestamp باشد تا مقایسه دو timestamp باهم بدون محاسبات پیچیده و افزایش بار محاسباتی صورت گیرد.
همچنین پیشنهاد میشود یک تابع در api با نام servertime تعریف شود که مقدار ساعت سرور را ارائه دهد. بهتر است ساختار آن Unix Timestamp باشد.
- بهتر است معیار ساعت سرور UTC باشد تا برای تمامی معامله گرها در سرتاسر جهان تفسیر یکسانی داشته باشد.
- اطلاع از ساعت سرور امکان ایجاد همگامی و تخمین متوسط زمان تاخیر در درخواست ها را برای مشتری فراهم می آورد. چنین تخمینی به زمان بندی بهتر در ارسال درخواست ها از سمت مشتری شده و امکان موفقیت در انجام برخی معاملات را افزایش میدهد.
- دقت ساعت سرور حداقل بایستی در حد هزارم ثانیه باشد یعنی یا یک عدد اعشاری باشد که قسمت صحیح آن شمارش ثانیه ها و قسمت اعشاری آن کسر ثانیه باشد و یا اگر ساعت سرور یک عدد صیحیح است حداقل بر مبنای هزارم ثانیه (و یا جزئی تر) باشد.
همچنین پیشنهاد میشود در استعلام سفارشات که توسط تابع /market/orders/list میشود، برای هر سفارش مقدار created_at با فرمت Unix Timestamp ارائه شود. چرا که هزینه محسباتی قیاس در سمت مشتری کاهش یابد.
- برای سازگاری با ساختار فعلی میتوان created_at را با فرمت فعلی حفظ کرد و پارامتر جدیدی با نام created_timestamp ایجاد کرد که در فرمت unix timestamp باشد.
علاوه بر این نیاز است تا در استعام سفارشات که توسط تابع /market/orders/list در دسترس است پارامتر updateTime اضافه گردد. این پارامتر بایستی مشخص کننده زمان آخرین تغییر در matchedAmount ، price ، amount باشد.
- افزودن این پارامتر این امکان را به مشتری میدهد تا با بار محاسباتی کم، تغییرات صورت گرفته را درک کرده و در صورت نیاز تصمیم مقتضی را اتخاذ کند.
امکانات مشابه
دو صرافی Binance و Kucoin از UNIX Timestamp به صورت یک عدد Long و با دقت هزارم ثانیه (millisecond) استفاده میکنند.
برای اطلاع از ساعت سرور در Binance تابع /api/v3/time و در Kucoin تابع /api/v1/timestamp ارائه شده است. https://binance-docs.github.io/apidocs/spot/en/#check-server-time https://docs.kucoin.com/#server-time
در Binance زمان ایجاد سفارش با پارامتر time و زمان بروزرسانی آن با پارامتر updateTime معرفی شده است. https://binance-docs.github.io/apidocs/spot/en/#change-log
در Kucoin زمان ایجاد سفارش با پارامتر createdAt مشخص شده است که به فرم عدد Long است. https://docs.kucoin.com/#list-orders
توضیح تکمیلی
با تشکر از شما
دوستان برنامه ای برای این فیچر ندارن؟ خیلی مهم هست واقعا. OMS های ایرانی هم این فیچر رو دارن. بدون زمان سرور عملا تاخیر رو نمیشه اندازه گیری کرد.