تراکنشها
آخرین ویرایش: @sipbikardi(opens in a new tab), ۲۶ تیر ۱۴۰۳
تراکنشها شامل دستورالعملهایی از حسابها هستند که به صورت رمزنگاریشده امضا شدهاند. یک حساب برای بهروزرسانی وضعیت شبکه اتریوم، تراکنشی را آغاز میکند. سادهترین تراکنش، انتقال اتر از یک حساب به حساب دیگر است.
پیشنیازها
برای کمک به فهمیدن این صفحه، بهتر است حساب های کاربری و مقدمهای بر اتریوم را مطالعه کنید.
تراکنش چیست؟
تراکنش اتریوم به اقدامی اشاره دارد که توسط یک حساب تحت مالکیت خارجی آغاز میشود، به عبارت دیگر حسابی که توسط یک انسان مدیریت میشود، نه یک قرارداد. بهعنوان مثال، اگر باب به آلیس 1 اتر ارسال کند، حساب باب باید بدهکار شود و حساب آلیس باید بستانکار شود. این عمل تغییر وضعیت توسط یک تراکنش صورت میگیرد.
نمودار برگرفته از Ethereum EVM illustrated(opens in a new tab)
تراکنشهایی که وضعیت EVM را تغییر میدهند، باید در کل شبکه پخش شوند. هر گره میتواند اجرای تراکنش در ماشین مجازی اتریوم (EVM) را درخواست کند؛ پس از این اتفاق، یک اعتبارسنج تراکنش را اجرا میکند و تغییر حالت حاصل را در بقیه شبکه تکثیر میکند.
تراکنش ها نیاز به کارمزد دارند و باید در یک بلوک تأیید شده قرار گیرند. برای سادهتر کردن این نمای کلی، کارمزدهای گاز و اعتبارسنجی را در جای دیگری پوشش خواهیم داد.
تراکنش ارسالی شامل اطلاعات زیر است:
از
- آدرس فرستنده که تراکنش را امضا خواهد کرد. این یک حساب مالکیت خارجی خواهد بود، چون حساب قرارداد نمیتواند تراکنش ارسال کنند.به
- آدرس دریافت کننده (اگر یک حساب با مالکیت خارجی باشد، تراکنش یک مقدار را منتقل خواهد کرد. اگر یک حساب قرارداد باشد، تراکنش کد قرارداد را اجرا میکند)امضاء
- شناسه فرستنده. زمانی ایجاد میشود که کلید خصوصی فرستنده تراکنش را امضا کند و تأیید کند که فرستنده این تراکنش را مجاز کرده استNonce
- یک شمارنده که به شکل متوالی افزایش می یابد و تعداد تراکنش های حساب را نشان میدهدارزش
- مقدار اتر فرستاده شده از آدرس فرستنده تراکنش به گیرنده (این مقدار در واحد اندازه گیری WEI نمایش داده میشود، که هر اتر برابر با 1e+18 wei است)داده ورودی(input data)
- قسمتی اختیاری برای قراردادن هر داده دلخواهgasLimit
- حداکثر مقدار واحدهای گازی که میتواند توسط تراکنش مصرف شود. ماشین مجازی اتریوم (EVM) واحدهای گاز لازم برای انجام هر مرحله محاسباتی تراکنش را مشخص می کندحداکثر انعام به ازای هر گاز (maxPriorityFeePerGas)
- حداکثر قیمت گازهایی که بهعنوان انعام به اعتبارسنج پرداخت میشودحداکثر کارمزد به ازای هر گاز (maxFeePerGas)
- حداکثر قیمتی که کاربر به ازای هر واحد گاز مایل به پرداخت است (شاملقیمت پایه به ازای هر گاز (baseFeePerGas)
وحداکثر قیمت اولویت به ازای هر گاز (maxPriorityFeePerGas)
)
گاز به محاسبات لازم برای پردازش تراکنش توسط اعتبارسنج اشاره میکند. کاربران برای این محاسبه باید هزینهای بپردازند. محدوده گاز (gasLimit)
، وحداکثر قیمت اولویت به ازای هر گاز (maxPriorityFeePerGas)
نشان دهنده بیشترین کارمزد تراکنش پرداخت شده به اعتبارسنج می باشد. دربارهی گاز بیشتر بدانید.
شیء تراکنش کمی شبیه به این خواهد بود:
1{2 from: "0xEA674fdDe714fd979de3EdF0F56AA9716B898ec8",3 to: "0xac03bb73b6a9e108530aff4df5077c2b3d481e5a",4 gasLimit: "21000",5 maxFeePerGas: "300",6 maxPriorityFeePerGas: "10",7 nonce: "0",8 value: "10000000000"9}نمایش همهکپی
اما یک شیء تراکنش باید با استفاده از کلید خصوصی فرستنده امضا شود. این کار ثابت میکند که تراکنش فقط میتواند از طرف فرستنده انجام شود و به صورت تقلبی ارسال نشده است.
یک کلاینت اتریوم مانند Geth این فرایند امضا را انجام میدهد.
نمونه فراخوانی JSON-RPC:
1{2 "id": 2,3 "jsonrpc": "2.0",4 "method": "account_signTransaction",5 "params": [6 {7 "from": "0x1923f626bb8dc025849e00f99c25fe2b2f7fb0db",8 "gas": "0x55555",9 "maxFeePerGas": "0x1234",10 "maxPriorityFeePerGas": "0x1234",11 "input": "0xabcd",12 "nonce": "0x0",13 "to": "0x07a565b7ed7d7a678680a4c162885bedbb695fe0",14 "value": "0x1234"15 }16 ]17}نمایش همهکپی
نمونهی پاسخ:
1{2 "jsonrpc": "2.0",3 "id": 2,4 "result": {5 "raw": "0xf88380018203339407a565b7ed7d7a678680a4c162885bedbb695fe080a44401a6e4000000000000000000000000000000000000000000000000000000000000001226a0223a7c9bcf5531c99be5ea7082183816eb20cfe0bbc322e97cc5c7f71ab8b20ea02aadee6b34b45bb15bc42d9c09de4a6754e7000908da72d48cc7704971491663",6 "tx": {7 "nonce": "0x0",8 "maxFeePerGas": "0x1234",9 "maxPriorityFeePerGas": "0x1234",10 "gas": "0x55555",11 "to": "0x07a565b7ed7d7a678680a4c162885bedbb695fe0",12 "value": "0x1234",13 "input": "0xabcd",14 "v": "0x26",15 "r": "0x223a7c9bcf5531c99be5ea7082183816eb20cfe0bbc322e97cc5c7f71ab8b20e",16 "s": "0x2aadee6b34b45bb15bc42d9c09de4a6754e7000908da72d48cc7704971491663",17 "hash": "0xeba2df809e7a612a0a0d444ccfa5c839624bdc00dd29e3340d46df3870f8a30e"18 }19 }20}نمایش همهکپی
raw
تراکنشی امضا شده است در فرم کدگذاری شده Recursive Length Prefix (RLP)tx
تراکنش امضاشده به شکل JSON است
با هش امضا، میتوان به صورت رمزنگاری ثابت کرد که تراکنش از فرستنده آمده و به شبکه ارسال شده است.
فیلد دادهها
اکثریت قریببهاتفاق تراکنشها از طریق یک حساب دارای مالکیت خارجی به یک قرارداد دسترسی دارند. اکثر قراردادها در Solidity نوشته شدهاند و فیلد دادههای آنها را مطابق با تفسیر میکنند.
چهار بایت اول با استفاده از هش نام تابع و آرگومانها مشخص میکند که کدام تابع را فراخوانی کند. گاهی اوقات میتوانید تابع را از انتخابگر با استفاده از این پایگاه داده(opens in a new tab) شناسایی کنید.
بقیه فراخواندادهها (calldata) آرگومان هستند، که مطابق با مشخصات ABI مشخص شدهاند(opens in a new tab).
برای مثال، بیایید به این تراکنش(opens in a new tab) نگاه کنیم. از برای مشاهدهی بیشتر کلیک کنید برای دیدن فراخواندادهها استفاده کنید.
انتخابگر تابع 0xa9059cbb
است. چندین تابع شناختهشده با این امضا وجود دارد(opens in a new tab). در این مورد کد منبع قرارداد(opens in a new tab) در Etherscan آپلود شده است، بنابراین میدانیم که این تابع transfer(address, uint256)
است.
بقیه دادهها عبارتند از:
10000000000000000000000004f6742badb049791cd9a37ea913f2bac38d012792000000000000000000000000000000000000000000000000000000003b0559f4
با توجه به مشخصات ABI، مقادیر صحیح (مانند آدرسها که اعداد صحیح 20 بایتی هستند) در ABI به صورت کلمات 32 بایتی ظاهر میشوند که ممکن است یک یا چند صفر در ابتدای آنها قرار داده شود. بنابراین ما میدانیم که آدرس «to»
4f6742badb049791cd9a302791cd9a302791cd99a32791cd99a310.com است.
مقدار
0x3b0559f4 = 990206452 است.
انواع تراکنشها
در اتریوم چند نوع تراکنش مختلف وجود دارد:
- تراکنش های منظم: تراکنش از یک حساب به حساب دیگر.
- تراکنشهای استقرار قرارداد: تراکنش بدون آدرس «to»، که در آن از فیلد دادهها برای کد قرارداد استفاده میشود.
- اجرای قرارداد: تراکنشی که با یک قرارداد هوشمند مستقر تعامل دارد. در این مورد، آدرس «to»، آدرس قرارداد هوشمند است.
دربارهی گاز
همانطور که گفته شد، انجام تراکنشها گاز مصرف میکند. تراکنشهای انتقال ساده به 21000 واحد گاز نیاز دارند.
بنابراین برای اینکه باب 1 اتر را به آلیس با baseFeePerGas
به میزان 190 gwei و maxPriorityFeePerGas
به میزان 10 gwei ارسال کند، باب باید هزینهی زیر را بپردازد:
1(190 + 10) * 21000 = 4,200,000 gwei2--یا--30.0042 اتر
مقدار 1.0042 اتر از حساب باب کسر خواهد شد (1 اتر برای آلیس + 0.0042 اتر برای هزینه گاز)
به حساب آلیس 1.0+ اتر بستانکار خواهد شد
کارمزد پایه 0.00399- اتر خواهد شد
اعتبارسنج انعام +0.000210 ETH را نگه می دارد
نمودار برگرفته از Ethereum EVM illustrated(opens in a new tab)
هر گازی که در تراکنش استفاده نشده باشد به حساب کاربری مسترد میشود.
تعاملات قرارداد هوشمند
گاز برای هر تراکنشی که شامل یک قرارداد هوشمند است، لازم است.
قراردادهای هوشمند همچنین میتوانند دارای عملکردهایی باشند که بهعنوان عملکردهای نما
(opens in a new tab) یا خالص
(opens in a new tab) شناخته میشوند، که وضعیت قرارداد را تغییر نمیدهند. به این ترتیب، فراخوانی این توابع از یک EOA نیازی به گاز ندارد. فراخوان RPC اصلی برای این سناریو eth_call
است
برخلاف زمانی که با استفاده از eth_call
قابل دسترسی است، این توابع نما
یا خالص
معمولاً به صورت داخلی نیز فراخوانده می شوند (یعنی از خود قرارداد یا از قرارداد دیگری) که کارمزد گس را به همراه دارد.
چرخهی حیات تراکنش
هنگامی که تراکنش ارسال شد، موارد زیر اتفاق میافتد:
یک هشِ تراکنش به صورت رمزنگاری شده تولید میشود:
0x97d99bc7729211111a21b12c933c949d4f31684f1d6954ff477d0477538ff017
سپس تراکنش شما در شبکه مخابره می شود و به استخری که شامل تمامی تراکنش های شبکه است که در حال انتظار می باشند اضافه می شود.
به منظور تایید و "موفقیت آمیز" در نظر گرفته شدن تراکنش شما، یک اعتبارسنج باید تراکنش شما را انتخاب کرده و داخل یک بلوک قرار دهد.
با گذر زمان بلوکی که حامل تراکنش شما است به وضعیت "مشروع" و سپس "نهایی" برروز رسانی می شود. این ارتقاها موجب می شوند که کاملا مطمئن شوید که تراکنش شما موفقیت آمیز بوده و هرگز تغییر نخواهد کرد. زمانی که یک بلوک "نهایی" شد فقط تنها زمانی که مورد یک حمله در حد و سطح شبکه قرار بگیرد می تواند تغییر یابد که چندین میلیارد دلار هزینه به بار خواهد آورد.
یک نسخهی آزمایشی تصویری
آستین را تماشا کنید که شما را دربارهی تراکنشها، گاز و استخراج راهنمایی میکند.
پاکت تراکنش تایپشده
اتریوم در ابتدا یک قالب برای تراکنشها داشت. هر تراکنش حاوی نانس (nonce)، قیمت گاز، حد گاز، آدرس گیرنده، مقدار، داده، v، r و s بود. این فیلد ها کدگذاری شده RLP هستند، تا چیزی شبیه این به نظر برسند:
RLP([nonce, gasPrice, gasLimit, to, value, data, v, r, s])
اتریوم به گونهای تکامل یافته است که از چندین نوع تراکنش پشتیبانی میکند تا پیادهسازی ویژگیهای جدیدی مانند لیستهای دسترسی و EIP-1559(opens in a new tab) را بدون تأثیر بر قالبهای تراکنش قدیمی امکانپذیر سازد.
EIP-2718(opens in a new tab) چیزی است که به این رفتار اجازه می دهد. تراکنش ها به صورت زیر تفسیر می شوند:
نوع معامله || TransactionPayload
که در آن فیلدها به صورت زیر تعریف میشوند:
TransactionType
- عددی بین 0 و 0x7f، برای مجموع 128 نوع تراکنش ممکن.TransactionPayload
- یک آرایهی بایت دلخواه که توسط نوع تراکنش تعریف شده است.
بر اساس مقدار TransactionType
، تراکنش را می توان به موارد زیر طبقهبندی کرد
تراکنش های نوع صفر (قدیمی): فرمت تراکنش اصلی که از زمان راهاندازی اتریوم استفاده شده است. اینها شامل ویژگیهای EIP-1559(opens in a new tab) مانند محاسبات دینامیک هزینه گس یا لیست دسترسی برای قراردادهای هوشمند نمیشوند. تراکنشهای قدیمی فاقد پیشوند خاصی هستند که نوع آنها را به صورت سریالی نشان میدهد، و با بایت
0xf8
هنگام استفاده از رمزگذاری پیشوند طول بازگشتی (RLP) شروع میشوند. مقدار TransactionType برای این تراکنشها0x0
است.تراکنشهای نوع یک:در پیشنهاد EIP-2930(opens in a new tab) بهعنوان بخشی از ارتقای برلین اتریوم معرفی شدند، این تراکنشها شامل پارامتر
accessList
هستند. این فهرست اقدام به مشخصکردن آدرسها و کلیدهای ذخیرهسازی میکند که تراکنش انتظار دارد به آنها دسترسی داشته باشد، و به کاهش بالقوه هزینههای گس برای تراکنشهای پیچیده شامل قراردادهای هوشمند کمک میکند. تغییرات بازار کارمزد EIP-1559 در تراکنشهای نوع یک گنجانده نشدهاند. تراکنشهای نوع 1 همچنین شامل یک پارامترyParity
هستند که میتواند0x0
یا0x1
باشد که نشاندهنده برابری مقدار y امضای secp256k1 است. تشخیص آنها اینطور است که با بایت0x01
شناسایی می شوند و مقدار TransactionType آنها0x1
است.تراکنشهای نوع 2 که معمولاً به تراکنشهای EIP-1559 گفته میشوند، تراکنشهایی هستند که در EIP-1559(opens in a new tab)، در بهروزرسانی لندن اتریوم معرفی شدهاند. آنها به مدل تراکنش استاندارد در شبکه اتریوم تبدیل شدهاند. این تراکنشها یک مکانیزم جدید بازار کارمزد را معرفی میکنند که با تفکیک کارمزد معامله به کارمزد پایه و کارمزد اولویت، قابلیت پیشبینی را بهبود میبخشد. آنها با بایت
0x02
شروع می شوند و شامل فیلدهایی مانندmaxPriorityFeePerGas
وmaxFeePerGas
میشوند. تراکنشهای نوع 2 اکنون به دلیل انعطافپذیری و کارایی، پیشفرض هستند، بهویژه در دورههای شلوغی بالای شبکه به دلیل توانایی آنها در کمک به کاربران در مدیریت قابل پیشبینیتر کارمزد تراکنشها مورد توجه قرار میگیرند. مقدار TransactionType برای این تراکنش ها0x2
است.
بیشتر بخوانید
آیا منبعی اجتماعی میشناسید که به شما کمک کرده باشد؟ این صفحه را ویرایش کنید و به آن اضافه کنید!