<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های mohamad najafi</title>
        <link>https://virgool.io/feed/@alfymohamad</link>
        <description>اگه بشه اسممو گذاشت &quot; توسعه دهنده &quot; فامیلیمو میزارم &quot; وب &quot;</description>
        <language>fa</language>
        <pubDate>2026-06-18 08:32:57</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/65284/avatar/sm1J7l.jpg?height=120&amp;width=120</url>
            <title>mohamad najafi</title>
            <link>https://virgool.io/@alfymohamad</link>
        </image>

                    <item>
                <title>تراکنش های جمعی یا Batch Transaction روی شبکه بلاکچین چیست؟</title>
                <link>https://virgool.io/@alfymohamad/%D8%AA%D8%B1%D8%A7%DA%A9%D9%86%D8%B4-%D9%87%D8%A7%DB%8C-%D8%AC%D9%85%D8%B9%DB%8C-%DB%8C%D8%A7-batch-transaction-%D8%B1%D9%88%DB%8C-%D8%B4%D8%A8%DA%A9%D9%87-%D8%A8%D9%84%D8%A7%DA%A9%DA%86%DB%8C%D9%86-%DA%86%DB%8C%D8%B3%D8%AA-yp5io3rkd9zk</link>
                <description>امروز داشتم بین تراکنش های ورودی پذیرندگان Payment4 میگشتم ٬ خیلی اتفاقی یه تراکنش دیدم که روی شبکه اتریم با توکن USDT انجام شده و بود و سیستم نتونسته بود  تشخیص بده. خیلی عجیب بود و  چنین اتفاقی احتمالش ۱ درصد هم نبود. رفتم واسه بررسی عمیق‌تر و دیدم بله تراکنش از نوع Batch transaction بوده و من کلا توی سیستم فکرشم نمیکردم کسی ازین مدل تراکنش ها بزنه. اما این مدل تراکنش ها خیلی معموله بین صرافی های بزرگ (صرافی ارسال کننده CoinBase بود 😎).حالا داستان این مدل تراکنش های جمعی (Batch Transaction) چیه؟اینجا سعی میکنم به صورت ساده و خلاصه توضیح بدم.صرافی های دیجیتال معمولا برای درخواست های برداشت کاربرانشون به این صورت عمل میکنند که اگر به‌صورت تک تک برداشت ها رو بفرستن توی شبکه مجموع فی شبکه به ازای همه تراکنش ها  بالا میره و اصلا براشون به صرفه نیست. پس هرگز به صورت تکی برداشت ها رو نمیفرستن توی شبکه.  میان و یه قرارداد هوشمند (Smart Contract) مینویسند که مسئول توزیع کل میزان برداشته (این نوع قراردادهای هوشمند معمولا به صورت اختصاصی برای هر شبکه نوشته میشه). بعدش به اندازه مجموع برداشت هایی که کاربران درخواست داده بودند   (مثلا 2000 USDT از نوع ERC20) رو به همراه آدرس ولت تمامی کاربران درخواست دهنده و سهم هر کدام ارسال میکنند به همون قرارداد هوشمندی که ساخته بودند و ازینجا به بعد کار اون قرار داد هوشمند شروع میشه. خودش به صورت کامل تمامی عملیات تسهیم رو میفرسته روی شبکه و دریافت کنندگان مقادیر مورد نظر رو دریافت خواهند کرد. تراکنش جمعی چه مزیتی داره؟یکی از بزرگترین مزیت هایی که داره اینه که شدیدا کارمزد شبکه رو کاهش میده. به عنوان مثال اگر ۱۰ تا تراکنش طی یک Batch Transaction صورت بگیره چیزی حدود ۶۰ درصد از کل کارمزد شبکه کم میشه البته این ۶۰ درصد  حدودی هست و کاملا به وضعیت شبکه و تعداد تراکنش و چند تا پارامتر دیگه وابسته ست.دیکود کردن این مدل تراکنش ها توی شبکه یه مقدار پیچیده‌تر از سایر تراکنش هاست٬ دلیلشم اینه که کل تراکنش ها توی شبکه یک hash خواهند داشت و عملا تمامی تراکنش های Batch Transaction  یه دونه در نظر گرفته میشه و جزئیات هر تراکنش از جمله آدرس مقصد دریافت کننده نهایی ٬ آدرس توکنی که روی اون تراکنش انجام میشه و میزان توکن انتقال یافته رو باید از  توی لاگ Receipt (رسید پرداخت) و مقدار input تراکنش بدست بیارید.مدتی قبل که با یه تیم روی  پروژه Luanchpad  کار میکردم با این مدل از تراکنش ها یعنی تراکنش های جمعی آشنا شدم.اگر علاقه دارید با این مدل قراردادهای هوشمند کار کنید و استفاده ازش رو یادبگیرید پیشنهاد میکنم این نمونه ای که ازش توی گیت هاب هست مطالعه کنید. ساختار و سازوکارشون شبیه همه و توی جزئیات هر شبکه ممکنه تفاوت هایی رو ایجاد کنه. https://github.com/xdevguild/sc-multi-sender-rs نکته آخر هم اینکه هر چقدر گشتم تا معادل فارسی Batch Transaction رو پیدا کنم چیزهای مناسبی پیدا نکردم. مثلا گوگل پیشنهاد داد بجاش بنویسم  &quot;معامله ی دسته ای&quot;  که خیلی مناسب فضای بلاک چین نبود 😁.به نظرم همون تراکنش جمعی خیلی مناسب تره. حالا اگر شما هم پیشنهادی دارید خوشحال میشم بنویسید برام.</description>
                <category>mohamad najafi</category>
                <author>mohamad najafi</author>
                <pubDate>Mon, 05 Aug 2024 20:24:51 +0330</pubDate>
            </item>
                    <item>
                <title>شروع کار با پایگاه داده MongoDB - قسمت دوم ( اتصال به وب سرویس )</title>
                <link>https://virgool.io/@alfymohamad/%D8%B4%D8%B1%D9%88%D8%B9-%DA%A9%D8%A7%D8%B1-%D8%A8%D8%A7-%D9%BE%D8%A7%DB%8C%DA%AF%D8%A7%D9%87-%D8%AF%D8%A7%D8%AF%D9%87-mongodb-%D9%82%D8%B3%D9%85%D8%AA-%D8%AF%D9%88%D9%85-%D8%A7%D8%AA%D8%B5%D8%A7%D9%84-%D8%A8%D9%87-%D9%88%D8%A8-%D8%B3%D8%B1%D9%88%DB%8C%D8%B3-theomltoia9x</link>
                <description>سلام مجدد. توی قسمت قبل با پیش نیاز های نصب و خود نصب و ایجاد پایگاه داده در MongoDb آشنا شدیم ( قسمت اول رو میتونید از اینجا ببینید ). تو این قسمت قصد دارم همین پایگاه داده رو به وب سرویس ساده ای که خودم میسازم متصلش کنم. تقریبا برای تمامی زبان های برنامه نویسی سمت سرور درایوری برای اتصال به پایگاه داده ی MongoDB وجود داره. از  پایتون و php بگیرید تا NodeJS و GoLang. بر طبق حوزه ی کاری که دارم انتخاب من NodeJS هست. پس ابتدا یه سرویس ساده ی NodeJS رو راه اندازی میکنم و با همون مثال اقدام به اتصال به پایگاه داده میکنم. برای شروع باید ابتدا پکیج NodeJS رو روی سیستمتون (تقریبا برای همه سیستم عامل ها و توزیع ها قابل نصب هست) نصب کنید. در بخش قبلی گفتم که سیستم عامل من لینوکس و توزیعش Ubuntu 20.04 هست که با استفاده از راهنمایی که وجود داره میتونم یا بصورت مستقیم پکیج رو دانلود و نصب کنم و یا برم سراغ ریپازیتوری ها (مخازن) . این انتخاب کاملا بستگی به شما داره اما نصب از ریپازیتوری ها راحت تر و سریع تر خواهد بود.بعد از نصب NodeJS یه سرویس ساده به صورت زیر توی فایلی به نام server.js مینویسیم:const http = require(&amp;quothttp&amp;quot);
const hostname = &amp;quot127.0.0.1&amp;quot
const port = 3000;
const server = http.createServer();
server.listen(port, hostname, () =&gt; {
          console.log(`Server running at http://${hostname}:${port}/`);
});این ساده ترین وب سرویسی هست که میشه توی NodeJS نوشت و از همین نقطه میشه شروع کرد و سرویس رو گسترش داد ( اگر استقبال بشه یه سریال نوشتاری هم از NodeJS مینویسم)تنها کاری که این سرویس میکنه اینه که پروتوکول HTTP رو روی پورت ۳۰۰۰ براتون فراهم میکنه تا بتونید یک وب سرویس پایدار داشته باشید.حالا با استفاده از ترمینال وارد دایرکتوری این فایل میشم و دستور زیر رو تایپ میکنم node server.jsبعد از فشردن کلید Enter ( یا همون Return) فرمان اجرای کد NodeJS رو به ترمینال میدیم و اگر NodeJS به درستی نصب شده باشه با پیام زیر روبرو میشید.Server running at http://127.0.0.1:3000/و این ینی سرویس در حال اجراست ( با فشردن کلید های Ctrl + C میتونید سرویس رو متوقف کنید)خب تا اینجا ما تونستیم سرویس رو ایجاد و راه اندازی کنیم. الان باید بریم سراغ درایور MongoDB با استفاده از فرمان زیر توی ترمینال میتونیم درایور mongoose رو نصب کنیم.npm install mongooseنکته : دقت کنید که npm به همراه NodeJS نصب میشه و وظیفش مدیریت پکیج های NodeJS هست پس نگران این دستور نباشید.بعد از کامل شدن نصب متوجه خواهید شد که یه دایرکتوری به نام node_modules به همراه یه فایل به نام package.json به دایرکتوری فعلیتون اضافه شده. در حقیقت دایرکتوری node_modules حاوی پکیج هایی هستند که موقع نصب از پکیج منیجر (npm) خواستید تا براتون بارگزاری کنه و اگر پاک بشن بایستی دوباره با دستور بالا اقدام به نصبشون کنید. فایل package.json هم حاوی پیکر بندی کلی پروژتون هست که وقتی اونو با یه ادیتور متنی مثل nano باز کنید با چنین خطوطی مواجه میشید:محتوای فایل package.jsonمحتوای فایل نشون میده که درایور mongoose با نسخه 5.11.15 پیش نیاز این پروژه هست .( اخرین نسخه mongoose در هنگام نوشتن این مطلب  5.11.15 هست و ممکنه با تغییر زمان و نسخه برای شما شماره ی دیگری از این نسخه رو نمایش بده) . هر وقت هم دایرکتوری node_modules شما پاک شد شما میتونید با فراخوانی دستور زیر اقدام به نصب تمام پیش نیاز ها (dependencies)  بکنید. npm installدوباره برمیگردیم به سراغ سرویس اصلیمون ینی فایل server.js . چند خط به این فایل اضافه میکنیم که بتونیم به یه پایگاه داده در MongoDB متصل بشیم.const http = require(&amp;quothttp&amp;quot);
const mongoose = require(&amp;quotmongoose&amp;quot);
const hostname = &amp;quot127.0.0.1&amp;quot
const port = 3000;
const server = http.createServer();
mongoose.connect(&amp;quotmongodb://localhost:27017/dbName&amp;quot).then(connection_result =&gt; {
	console.log(&amp;quotConnected to mongo database&amp;quot);
}).catch(error =&gt; {
	console.log(error)
})
server.listen(port, hostname, () =&gt; {
	console.log(`Server running at http://${hostname}:${port}/`);
});توی خط دوم فقط ماژول mongoose رو اضافه کردیم.توی خط ششم هم از درایور mongoose خواستیم که به پایگاه داده dbName متصل بشه (البته این پایگاه داده فعلا هیچ  کاربر و رمز عبوری نداره ). درخواست اتصال رو هم به صورت promise فرستادیم که اگر اتصال به درستی انجام شد به صورت پیام در ترمینال نشون بده و اگر هم احیانا به هر دلیل اشکالی در اتصال وجود داشت باز هم در قسمت catch اشکال رو در ترمینال درج کنه. اینطوری میتونیم راحت تر  با تفسیر متن اشکال درج شده مشکلات احتمالی رو حل کنیم . توی قسمت اول بهتون آموزش داده بودیم چطوری پایگاه داده رو با سطح دسترسی کاربر خاص و رمز عبور دلخواه بسازید. اگر بر اون اساس پایگاه داده خودتون رو ساختید کافیه بجای خط ششم از الگوی زیر استفاده کنیدmongoose.connect(&amp;quotmongodb://dbUserName:dbPassword@localhost:27017/dbName&amp;quot).then(connection_result =&gt; {
	console.log(&amp;quotConnected to mongo database&amp;quot);
}).catch(error =&gt; {
         console.log(error)
})با استفاده از الگوی بالا میتونید به پایگاه داده ی dbNam با نام کاربری dbUserName و رمز عبور dbPassword متصل بشید. فقط دقت کنید که اگر این موارد رو به درستی وارد نکنید بعد از اجرای سرویس ترمینال وجود اشکالی رو گوشزد میکنه که ناشی از همین اشتباه است.امیدوارم این قسمت رو هم با دقت دنبال کرده باشید.در قسمت های بعد به سراغ گسترش سرویس خواهیم رفت و سعی میکنیم مدلسازی کنیم و دیتا های مورد نیازمون رو ذخیره یا بازخوانی کنیم.همیشه پر انرژی باشید و برقرار</description>
                <category>mohamad najafi</category>
                <author>mohamad najafi</author>
                <pubDate>Mon, 08 Feb 2021 17:11:07 +0330</pubDate>
            </item>
                    <item>
                <title>شروع کار با پایگاه داده MongoDB - قسمت اول (آغاز دوستی با مونگوی دوست داشتنی)</title>
                <link>https://virgool.io/@alfymohamad/%D8%B4%D8%B1%D9%88%D8%B9-%DA%A9%D8%A7%D8%B1-%D8%A8%D8%A7-%D9%BE%D8%A7%DB%8C%DA%AF%D8%A7%D9%87-%D8%AF%D8%A7%D8%AF%D9%87-mongodb-%D9%82%D8%B3%D9%85%D8%AA-%D8%A7%D9%88%D9%84-%D8%B4%D8%B1%D9%88%D8%B9-%DA%A9%D8%A7%D8%B1-%D8%A8%D8%A7-%D9%85%D9%88%D9%86%DA%AF%D9%88%DB%8C-%D8%AF%D9%88%D8%B3%D8%AA-%D8%AF%D8%A7%D8%B4%D8%AA%D9%86%DB%8C-iw8qyk3l3oqa</link>
                <description>سلام. من شاید خیلی کمتر از اونی باشم که بخوام در مورد این پایگاه داده صحبت کنم اما امروز یه اتفاقی افتاد که فکر کردم شاید خوب باشه تجربیاتم رو به اشتراک بزارم. اون اتفاق هم این بود که خیلی اتفاقی به دنبال موضوعی در رابطه با مونگو توی وب فارسی گشتم و دیدم چقدر مطلب در موردش کمه. همین باعث شد که گفتم به اشتراک گذاری دانسته هام  با اینکه فرصت روزانم برای نوشتن خیلی کمه ٬  اما شاید به درد یکی مثل ۵ سال قبل من بخوره بتونه مسیرش رو باز کنه.البته همیشه خوندن رفرنس های خارجی رو پیشنهاد میدم . چه بسا که همین نوشته بتونه خیلی از کسانی رو که در ابتدای راه هستند رو راه بندازه و هدفم هم همینه.خب دیگه مقدمه چینی بسه. بریم سراغ اصل مطلب...مونگو یا بهتر بگم MongoDB یکی از پایگاه داده های NoSQL هست که البته تنهاترینشون هم نیست اما فکر میکنم عمومی ترینشون باشه. تمام اصول یک پایگاه داده ی کامل رو داره و همیشه بحث بر سر این بوده که پروژه مون رو با مونگو بنویسیم یا با پایگاه داده های SQL . راحت ترین جوابش این هست که برای پروژه های استارتاپی میتونه گزینه خوبی باشه. چون اون بخشی که همه باهاش تقریبا ۷۰ درصد کارشون رو انجام میدن رو به سادگی در اختیارتون قرار میده و واقعا ساده با مسائل برخورد میکنه.در ابتدا یه سری فرض در نظر میگیریم و بر اساس اونها کارمون رو ادامه میدیم تا بصورت عملی وارد دنیای MongoDB بشیم. من از سیستم عامل لینوکس و توزیع ubuntu 20.04 استفاده میکنم. برای نصب پایگاه داده از داکیونت رسمی خود MongoDB استفاده میکنم که آدرسش هم توی خط پایین نوشتم.https://docs.mongodb.com/manual/tutorial/install-mongodb-on-ubuntu/فرایند نصب خیلی ساده و سر راست هست که تو همون لینک بالا قدم به قدم توضیح داده شده.بعد از تکمیل فرایند نصب با دستور ساده ی mongo وارد محیط شل (shell) مونگو میشم و این اولین قدم برای ارتباط با پایگاه داده هست.  دستورات shell خیلی زیاد هستن و من قصد ندارم همشو توضیح بدم. فقط دستورات مهم و اونایی که توی ساختن یک پایگاه داده ساده کمک میکنند رو بهتون میگم. نمایش تمام پایگاه داده ها:show dbsبا این دستور میتونید تمام پایگاه داده های مونگو (چه پایگاههای پیش فرض و چه اونایی که خودمون میسازیم‌)  رو ببینیم. پایگاههای داده ی پیش فرض مونگوایجاد پایگاه داده :use dbNameبا این دستور پایگاه داده خودتون رو با نام dbName میسازید و البته اگر نام این پایگاه داده از قبل وجود داشته باشد وارد اون میشید. با این دستور هنوز پایگاه داده ای نساختیم و فقط به مونگو اعلام کردیم که قراره یه پایگاه داده با این نام بسازیم. حالا وقت اضافه کردن داده هست. افزودن داده به پایگاه داده:مونگو بر خلاف پایگاه های داده ی SQL که از جدول ها برای جدا کردن موجودیت های خودشون استفاده میکنند٬ چیزی داره به نام کالکشن (collection) . در حقیقت کالکشن ها شبیه جداول رفتار میکنند و ما میتونیم مدل های دلخواهمون رو داخل اونا تعریف کنیم. اصطلاحا به مدل هایی که داخل هر کالکشن تعریف میکنیم اسکیما (schema) گفته میشه. به زبان دیگه هر اسکیما مشخص میکنه که هر کالکشن چه جایگاههایی با چه نوع نوع داده ای (data type) رو میتونه توی خودش ذخیره کنه. در مورد اسکیما ها بعدها بیشتر توضیح میدم. الان قصد دارم یه کالکشن رو توی دیتا بیسم بسازم و یه داده هم بهش اضافه کنم. میتونیم این کار رو توئمان انجام بدیم. بصورت زیر : db.usersCollection.insert({ name: &amp;quotmohamad&amp;quot, age: 25, hobbies:[&amp;quotgame&amp;quot,&amp;quotsport&amp;quot]   })این دستور یه کالکشن با نام usersCollection ایجاد میکنه و داده ای رو بصورت بالا که شامل name و age  hobbies کاربر هست رو بهش اضافه میکنه.بعد از وارد کردن خط بالا و فشردن کلید Enter مونگو پیامی میده که نتیجه کار رو اعلام میکنهنتیجه میگه که تعداد داده ی وارد شده ۱ استحالا برای وارد کردن سایر داده ها و کالکشن ها هم میتونیم به همین صورت عمل کنیمنمایش کالکشن های ساخته شده:تو این مرحله اگر دستور زیر رو وارد کنید میتونید تمام کالکشن هایی رو که ساختید رو ببینید:show collectionsنام کالکشن ایجاد شده نمایش داده شدهدر حقیقت شما تا الان تونستید ساختاری به نام کالکشن ایجاد کنید که میتونی داده ی تمام کاربران شما رو ذخیره کنه . همینطور میتونید برای تمام موجودیت های دیگر پروژه تون کالکشن بسازید. نکته مهم : استفاده از shell توی مونگو شاید بعدها خیلی به کارتون نیاد و با همون اسکیما ها و ماژول mongoos میتونید همه این کارها رو توی کد هاتون خیلی سریعتر و تمیزتر انجام بدید. پس نترسید. صرفا جهت آشنایی با محیط  و البته روش ساختن پایگاه داده وارد بحث shell شدمحالا که پایگاه داده رو ساختیم باید یه نام کاربری و رمز عبور بهش نسبت بدیم تا بتونیم بصورت امن تر و اصولی تر با استفاده از رابط های مختلف بهش متصل بشیماضافه کردن نام کاربری و رمز عبور به یک پایگاه داده : db.createUser({user: &amp;quotdbUserName&amp;quot,pwd:&amp;quotdbPassword&amp;quot,roles: [ { role: &amp;quotdbOwner&amp;quot, db: &amp;quotdbName&amp;quot } ]} )با تکه کد بالا میتونید نام کاربری dbUserName و رمز عبور dbPassword رو به پایگاه داده dbName نسبت بدید. البته اون قسمت role هم میتونه مقادیر مختلفی بگیره و سطح دسترسی های مختلفی به کاربر پایگاه داده بده.نتیجه ی اضافه کردن یه کاربر با رمز عبور به پایگاه دادهالان پایگاه داده ای که ساختیم آماده ست برای اتصال به وب اپلیکیشن node از طریق ماژول mongoose  .اگر عمری باشه در قسمت بعدی توضیح میدم که چطور  به پایگاه داده متصل بشیم و چطور با استفاده از ماژول های واسط روی اون اطلاعات رو بنویسیم و بخونیم.همیشه پر انرژی باشید و برقرار</description>
                <category>mohamad najafi</category>
                <author>mohamad najafi</author>
                <pubDate>Sat, 06 Feb 2021 02:20:57 +0330</pubDate>
            </item>
            </channel>
</rss>