رضا
6 ماه پیش توسط رضا مطرح شد
11 پاسخ

پیاده سازی کیف پول با لاراول

سلام
دوستان من یه صرافی رمز ارز نوشتم هیچ مشکلی ندارم فقط می خوام توسعه بدم برای خودم و دارم از اول تمام کدها رو مجدد با نهایت بهینه سازی می نویسم و چند جایی به ترتیب میام همینجا سوالاتم رو مطرح می کنم تا تجربیات همه استفاده کنم شایدم بعدا به کار بقیه دوستان هم بیاد.
تو صرافی هر یوزر که عضو میشه حداقل 400 و حداکثر 1000 تا کیف پول هر کاربر داره مثلا کیف پول تومن موجودی فعال موجودی قفل شده من برای پیاده سازی اومده اینکارو کردم
user_id
coin_id
amount
freez
یعنی هر یوزر عضو میشه براش حداقل 40 سطر تو دیتابیس با این مشخصات میسازه اگه 1000 کاربر داشته باشیم ولتهامون بین 400 هزار تا 1 میلیون رکورد هستش اگه 100 هزار کاربر داشته باشیم ولت هامون میشه 100 میلیون رکورد و 1 میلیون کاربر میشه ولت هامون 1 میلیارد رکورد
سوالات بنده حقیر :
1- به نظرتون mysql مناسب هستش اصلا ؟
2- به نظرتون برای هر یوزر من بجای ساخته یک رکورد برای هر ولت بیام کلا 1 رکورد بسازم که توی اون رکورد مثلا 1000 تا دیتا رو نگهدارم اصولی هستش اصلا (اینکارو نکردم گفتم من راه جدا سازی هر ولت رو رفتم)
حالا مشکل کی و کجا خیلی خودشو نشون داره میده که باز با یکسری کارها بهترش کردم
تو ادمین نمایش ولت ها
تو ادمین نمایش ولت های دارای موجودی
تو ادمین گزارش گیری از ولت ها
اینها مورادی هستش که با زیاد شدن یوزرها یک هو می بینید چند ده دقیقه طول میکشه تا خروجی بیاد باز من اومدم صف گذاشتم خروجی رو مدیریت کردم که پارت پارت نمایش بده و خیلی کارهای دیگه ولی سوال اصلی من اینه اصلا صرافی های بزرگ چیکار می کنم پایگاه دادشون چیه به نظرتون singlestore این پایگاه های داده که ابری هستش بهترن ؟ به نظرتون کلا از چند دیتابیس استفاده کنم بهتره
ما یه دیتابیس حجیم چند میلیاردی دیگه داریم که اوردر ها توشن اون اصلا داستانش خیلی خیلی پیچیده تره من می خوام بدون اصلا پیشنهاد شما برای اینکار های بزرگ چی هستش هم تو دیتابس هم تو کد زدن بهینه و .... فقط لطفا دوستانی که کار واقعی کردن جواب بدن تو حالت تئوری اصلا بهش فکر نکنید من 8 ماه بیشتر کار کردم خیلی خیلی روش ها رو تست کردم.


ثبت پرسش جدید
محمد رضا
تخصص : Full Stack Developer
@salar.mohammad2013 6 ماه پیش آپدیت شد
0

سلام دوست عزیز
من خیلی با سازو کار صرافی ها اشنایی ندارم که بدونم داستان های والت و نوع کارشون رو
ولی چیزی که فهمیدم اینه که شما 40 نوع والت یا کیف پول داری که طرف میتونه شارژشون کنه ( بر اساس سطری که ایجاد کردی میگم )
نوشتی 400 والت ولی 40 سطر گفتی اضاف میشه که نفهمیدم دقیق برای چیه
از دید من دیتابیس ایراد داره و نباید اینطوری برای شخص سطر اضاف بشه
مثلا توی کیف پول شما میتونی چند فیلد به صورت enum داشته باشی که نوع ولت رو مشخص کنی توش
حالا با تغییر در هر ولت یه رکورد جدید ایجاد با مقدار + برای افزودن تغییر جدید و - برای کاهش مقدار جدید و در نهایت تو یه گردش حساب از همه ی فعالیت های شخص مثل بانک ها داری
خوبیش در عملیات ثبت و در ج و همه چیه که خیلی راحت فقط درخواست افزودن به دیتابیس داده میشه
بدیش چیزی که من فهمیدم از دیتابیست اینه که همون 40 سطر رو که مربوط به والت هست رو همش ویرایش میکنی و تغییر میدی مقدار توش با این روشی که گفتم هر شخص میتونی بی نهایت تراکنش داشته باشه و رکورد به جدول اضاف کنه
و برای تراز و فهمیدن موجودی کیف پول باید sum بزنی و group by کنی بر اساس شخص و نوع کیف پول
این یه دیتابیسی هست که به نظرم بیشتر اینطور استفاده میشه
من توی سرور پارس پک هم که میام موجودی حسابم رو ببینم 5 ثانیه طول میکشه تا محاسبه میکنه و بهم میگه ( منظورم اینه که داره کوئری سام میزنه این داستانا و به خاطر رکورد زیادش لگ داره )


رضا
@Laravedev68 6 ماه پیش مطرح شد
0

سلام و تشکر
اشتباه تایپی من رو ببخشید عرض کردم هر کاربر حداقل 400 ولت داره شایدم تا 1000 ولت برسه یعنی هر یوزر عضو میشه 400 الی هزار سطرح تو دیتابیس Wallet براش ساخته میشه هر سطر یوز شناسه اون کاربر نوع کیف و موجودی یعنی من اگه مثلا 10 هزار کاربر عضو سایت باشن حداقل 4 تا 10 میلیون سطر تو دیتابیس ولت ایجاد شده ماله این یوزرها خوب این تازه 10 هزا رکاربر هستش حساب کنید یه صرافی نرمال بعد یک سال بیش از 100 هزار کاربر حداقل میگیره یعنی رکورد دیتابیس ولت فقط میلیارد شده الان خوب تو میلیارد رکورد بخوای جستجو کنی یه فیلتر خاص مثلا بگی همه کیف هایی که دارای موجودی هستن و نوع ارز توی کیف مثلا ترون هستش پیدا کن این دستور خودش باعث تایم اوت میشه حالا با مدیریت صف و ... اینو درست میشه کرد منظور اصلی من اینه :
دیتابیس هایی که رکورد جدول هاش میلیارد رکورد هستش و هر کاربر با رکورد ها همیشه در ارتباط هستش مثال :
کاربر وارد صفحه معاملات ارز بیت کوین میشه سیستم میاد تمام معاملات خرید و فروش بیت کوین همه ی کاربر ها که باز هستن رو بررسی می کنه می خوام بدون اینطور دیتابیس های میلیارد رکوردی که کاربرها همش با دیتابیس در ارتباط هستن و هی بهش وصل میشن و دیتاها هی دارن اپدیت میشن میلیارد رکورد میلیون رکورد اپدیت داره در دقیقه این دیتابیس ها بهترین نوع پایگاه داده براشون چی هستش اصلا ؟ اضلا mysql جواب میده ساختارهایی مثل singlestore تا حالا کسی اینجا باهاش کار کرده ؟
عزیزان تنها پلتفرمی که شاید اینقدر دیتابیس درگیر هستش همین صرافی میشه البته من تا الان دیدم و تا الان چیز دیگه ای ندیدم اینقدر درگیری لحظه ای کاربر با میلیارد رکورد در لحظه داشته باشه


رایموند
تخصص : مختصص وردپرس - برنامه نویس لار...
@Raymond 6 ماه پیش آپدیت شد
1

درود خوبی...
۱- اگر پروژه تون با پردازش های سنگین سرکار داره نیاز به استفاده NoSql دارید که سیستم‌های بی ساختار یا تحلیل داده‌های بزرگ مناسب است.
۲- برای هر یورز یک transactionid و amount داره و خیلی پیچیده نکن که الکی هر بار رکورد جدید ثبت میشه رو پر نکند.


رضا
@Laravedev68 6 ماه پیش مطرح شد
-1

ممنون از پاسخ ولی عزیز واقعا پیچیده هستش :
در نظر بگیر 500 تا 1000 رمز ارز داریم هر رمز ارز باید براش به هر یوزر عضو یک ولت اختصاصی بدیم یعنی در هر صورت سطر جدول رو به ازای هر کاربر 500 تا 1000 می گیره چون ادرس ولت بلاکچینی موجودی ولت موجودی قفل شده ولت و ... به ازای هر رمز ارز برای هر کاربر باید داشته باشیم کیف پول داخلی نیست فقط با یه موجودی ساده


رایموند
تخصص : مختصص وردپرس - برنامه نویس لار...
@Raymond 6 ماه پیش مطرح شد
0

@Laravedev68
بله متوجه ام
یعنی برای هر ارز جدول جداگانه نوشته بشه؟


رضا
@Laravedev68 6 ماه پیش مطرح شد
0

عزیز من یه جدول Wallet دارم توی این
user_id
coin_id
amount
freez
erc20_address
bep20_address
trc20_address
و .... تقریبا اینجا 30 تا گزینه داریم
حالا هر کاربر عضو سایت میشه به ازای عضو شدنش به ازای هر توکن رمز ارز که سایت پشتیبانی می کنه اینجا یه ولت براش می سازه سایت 500 ارز ساپورت می کنه ایجاد برای همون یه کاربر 500 تا سطر ساخته میشه هر سطر مربوط به یه ارز خاص چون هر ارز برای اون کاربر داخلش 40 تا داده متفاوت باید ذخیره بشه. مثلا یه کاربر ولت تتر براش ساخته شد تو یه سطر حالا یه ادرس بلاکچین اتریوم هست یکی بلاکچین ترون و .... خیلی خیلی دردسر داره اصلا کل صرافی یه طرف فقط دو بخشش یه طرف بخش ولت هاش بخش معاملاتش اصلا واقعا هر چی تجربه داشته باشی باز تو پیاده سازی صرافی که متصل به بلاکچین باشه انگار هیچی واقعا بلد نیستی نسبت به بقیه کدهایی که زده شده منظورم همه کدهای دیگه تو یه محتوی هستن اما این واقعا فرق داره. من قبلا صرافی نوبیتکس ناراحت بودم باهاش کار می کردم به عنوان یوزر چرا معامله ثبت می کنم چند ثانیه طول میکشه معامله برخورد کنه انجام بشه اینجا کد می زنم می فهمم واقعا اصلا یه دنیا دیگست برای همین تجربه کسی رو می خوام که خودش کار اینطوری انجام داده باشه چالش هاشو دیده باشه


محمد رضا
تخصص : Full Stack Developer
@salar.mohammad2013 6 ماه پیش مطرح شد
1

من واقعا راجب دیتابیس میلیارد ریکوردی نمیتونم نظر بدم
در حد میلیون میدونم mysql اوکی هست
اما باید بدونی نوع نگارش دیتابیست مشکوکه
این که هر کاربری اضاف میشه 400 رکورد ذخیره میکنی براش جالب نیست
شما یه میلیون کیف پول هم که داشته باشی یه جدول جدا تعریف کن هر 1000 تا رو اگر واقعا مشخص هست توش اضاف کن ( همون 400 تایی که داری هر بار اضاف میکنی و اجباری میدیو بزار اصلا پیشفرض فقط )
بعد توی جدول تراکنش شخص هر وقت کیف پولش رو شارژ میکنه فقط فیلد مقدار رو کمو زیاد کن و با کلید خارجی بگو برای کدوم والت هست
اینطوری مطمینم هر شخص که نمیاد این همه کیف پول بسازه و شارژ کنه با چند تا محدود کار میکنه
کلی باعث میشه رکورد جدولت کم بشه
بعدم نیازی نیست شما هر بار جستجو کنی توی جدول تراکنش ( البته نمیدونم اصلا چرا باید همش جستجو کنی و صرافی دقیقا چیکار داره میکنه ) ولی موقع افزودن و برداشت از حساب شما فقط یه ثبت رکورد داری همین درخواست ثبت فقط میدی
برای هر کار بر هم فقط و فقط یک بار که وارد پنلش میشه موجودی کیف پولشو محاسبه کن بقیش برای نمایش از کش مرورگر طرف برای نمایش ب خودش استفاده کن تا زمانی که مجبور نیستی چیزی جست و جو نشه برات
الان شما با عمل افزایش کیف پول برای هر شخص مجبوری بری بین یک میلیارد رکورد ب قول خودت ، کیف پول طرف رو پیدا کنی و مقدارش رو زیاد کنی
ولی با روشی که من میگم برای درج نیاز به جست و جوی چیزی نداری اصلا فقط شناسه شخص و نوع کیف پول و مقدار کاهش یا افزایش رو میزاری ( یعنی حتی نیاز نیست بدونی الان طرف چقدر داره که افزایش خورد )


محمد رضا
تخصص : Full Stack Developer
@salar.mohammad2013 6 ماه پیش مطرح شد
0

چون هر ارز برای اون کاربر داخلش 40 تا داده متفاوت باید ذخیره بشه

اگر برای این مجبوری که اون 500 رکورد رو ذخیره کنی باز هم جدول والت رو جدا کن
یه جدول دوم ایجاد کن به اسم جزئیات کیف پول و اطلاعات 40 موردی که میگی رو بزار توی اون
ولی باز هم جدول سوم که مربوط به تراکنش هست رو جدا کن
اینطوری مثلا کیف پول ریال توی جدول کیف پول ها ساخته شده
توی جدول جزئیات یک سطر با 40 داده ی متفاوت براش ذخیره شده
حالا توی جدول تراکنش فقط میگی کیف پول ریال بهش یک میلیون افزوده شد
اصلا نیاز نیست به اون جدول جزئیات که ب قول شما یک میلیارد ریکورد داره لحظه یه لحظه کوئری زد مگر این که برای هر تراکنش اطلاعات اون 40 ستون مربوط به والت ریال لازم باشه همش دونسته بشه و چک بشه و هرچی
در این حالت خدا صبر به شما و پروژتون بده 😂😂😀😁


رضا
@Laravedev68 6 ماه پیش مطرح شد
1

راه حل های شما یقینا کاربردی هستش من اتفاقا به برخی راه حل های شما فکر کرده بودم ولی هدف من کلا ایجاد چیزی هستش که واقعا محدود به اگر و اما نباشه یعنی دنبال راهکاری هستم که واقعا اگه پلتفرمی که ایجاد می کنم میلیون کاربر داشت و همه در حال کار واقعا پاسخگو باشه بیشتر حکم چالش داره بله شاید برای سایت در سال های اول به این بخش نرسه ولی می خوام از اول کد برای کار مناسب باشه.
پیشنهاد شما شاید برای ولت کاربردی باشه اما برای اوردر یا همون سفارشات واقعا کاربری نیست شاید کاربر همیشه با ولت سرو کار نداشته باشه اما کاربرها همیشه با لیست سفارشات کار دارن هر کاربر هر دقیقه شاید چند اوردر بزنه لغو کنه یا اوردرش بهم برخورد کنه و .... بیشتر تو فکر این هستم جدول ها رو جدا کنم یعنی بیام کلا 3 تا سرور برای پایگاه داده بذارم.
1- پایگاه داده کلی سایت
2- پایگاه داده کیف پول ها
3- پایگاه داده سفارشات
هر کدوم روی سرور جدا که وقتی سایت لود میشه اگه هر کدوم درگیر بودن تو لود خود سایت مشکل نباشه
واقعا ممنون بابت راهنماییتون


سید آرین سید مومن
تخصص : junior security researcher
@arianseyed 6 ماه پیش مطرح شد
0

@Laravedev68 درود

فکر کنم کلا طراحی دیتابیستون زیاد جالب نیست همانطور که رایموند عزیز گفت بهتره که از no sql استفاده کنید


حسن حکمتی
تخصص : برنامه نویس وب و بلاکچین
@hekmati 3 ماه پیش آپدیت شد
0

سلام
عذرخواهی میکنم که یک پرسش قدیمی رو بروز رسانی میکنم.
دوست گرامی اساسا مسیر معرفی شده برای صرافی کاملا اشتباه است، در واقع فیلدهایی که معرفی نمودید و به این حجم از رکوردهای غیر ضروری رسیدید به این دلیل بوده که طراحی دیتابیس بر اساس تفکری ساده از سی فای(Centralized Finance) شکل گرفته در صورتی که نوع امور مالی برای یک صرافی ارز دیجیتال باید ترکیبی از امور مالی حوزه سی فای و دیفای (Decentralized Finance) باشد. قاعدتا طراحی دیتابیس نیز باید بر اساس درک عمیق از هر دو امور مالی معرفی شده باشد.
برای مثال اگر از ویژگی استاندارد ها و پروتکل های شبکه های بلاکچین به درستی استفاده شود تنوع ولت ها و موجودی ها و ویژگی ها مهم و ضروری دیگر روی جداول مختلف توزیع می گردد تا مدیریت بهتری صورت پذیرد.

برای اینکه چالش روش اعمال شده را بهتر بیان کنم یک مثال عنوان میکنم.
فرض کنید برای محاسبه کارمزد لازم است تراکنش یک ماه گذشته ولت ها را محاسبه نمایید؟ آیا به راحتی 1 میلیارد رکورد شما به 30 میلیارد رکورد تبدیل نمی شود؟ دوم اینکه شما در یک زمان محدود کات آف در بازه کوتاهی از شبانه روز که حجم معاملات به حداقل می رسد مثلا ساعت 12 شب تا 5 صبح لازم است محاسبات کارمزد را در زمان بسیار محدود انجام دهید، در حد ثانیه و دقیقه، آیا این زمان برای 30 میلیارد رکورد امکان پذیر است؟

راه حل: قبل از طراحی دیتابیس لازم است در مورد امور مالی متمرکز و غیر متمرکز به قدر کافی مطالعه و تحقیق عمیق داشته باشید.
موفق باشید


برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام