پرش به محتوای اصلی

تراکنش‌ها

آخرین ویرایش: , Invalid DateTime

تراکنش‌ها شامل دستورالعمل‌هایی از حساب‌ها هستند که به صورت رمزنگاری‌شده امضا شده‌اند. یک حساب برای به‌روزرسانی وضعیت شبکه اتریوم، تراکنشی را آغاز می‌کند. ساده‌ترین تراکنش، انتقال اتر از یک حساب به حساب دیگر است.

پیش‌نیازها

برای کمک به فهمیدن این صفحه، بهتر است حساب های کاربری و مقدمه‌ای بر اتریوم را مطالعه کنید.

تراکنش چیست؟

تراکنش اتریوم به اقدامی اشاره دارد که توسط یک حساب تحت مالکیت خارجی آغاز می‌شود، به عبارت دیگر حسابی که توسط یک انسان مدیریت می‌شود، نه یک قرارداد. به‌عنوان مثال، اگر باب به آلیس 1 اتر ارسال کند، حساب باب باید بدهکار شود و حساب آلیس باید بستانکار شود. این عمل تغییر وضعیت توسط یک تراکنش صورت می‌گیرد.

شکلی نشان‌دهنده‌ی یک تراکنش که باعث تغییر وضعیت می‌شود (opens in a new tab) نمودار برگرفته از Ethereum EVM illustrated(opens in a new tab)

تراکنش‌هایی که وضعیت EVM را تغییر می‌دهند، باید در کل شبکه پخش شوند. هر گره‌ای می‌تواند درخواستی برای اجرای تراکنش در EVM ارسال کند. پس از این اتفاق، یک استخراج‌گر تراکنش را اجرا می‌کند و تغییر حالت حاصل را به بقیه‌ی شبکه پخش می‌کند.

تراکنش‌ها نیاز به کارمزد دارند و برای معتبر شدن باید استخراج شوند. برای ساده‌تر کردن این نمای کلی، کارمزدهای گاز و استخراج را در جای دیگری پوشش خواهیم داد.

تراکنش ارسالی شامل اطلاعات زیر است:

  • recipient - آدرس دریافت‌کننده (اگر یک حساب با مالکیت خارجی باشد، تراکنش یک ارزش را منتقل می‌کند. اگر یک حساب قرارداد باشد، تراکنش کد قرارداد را اجرا می‌کند)
  • signature - شناسه‌ی فرستنده. زمانی ایجاد می‌شود که کلید خصوصی فرستنده تراکنش را امضا کند و تأیید کند که فرستنده این تراکنش را مجاز کرده است
  • value - مقدار اتر برای انتقال از فرستنده به گیرنده (به WEI، واحد خردی از اتر)
  • data - فیلد اختیاری برای گنجاندن داده‌های دلخواه
  • gasLimit - حداکثر مقدار واحدهای گازی که می‌تواند توسط تراکنش مصرف شود. واحدهای گاز مراحل محاسباتی را نشان می‌دهند
  • 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}
10
نمایش همه
📋 کپی

اما یک شیء تراکنش باید با استفاده از کلید خصوصی فرستنده امضا شود. این کار ثابت می‌کند که تراکنش فقط می‌تواند از طرف فرستنده انجام شود و به صورت تقلبی ارسال نشده است.

یک کلاینت اتریوم مانند Geth این فرایند امضا را انجام می‌دهد.

نمونه‌ی فراخوانی JSON-RPC(opens in a new tab):

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}
18
نمایش همه
📋 کپی

نمونه‌ی پاسخ:

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}
21
نمایش همه
📋 کپی
  • raw تراکنش امضاشده به شکل رمزگذاری‌شده با پیشوند طول بازگشتی (RLP) است
  • tx تراکنش امضاشده به شکل JSON است

با هش امضا، می‌توان به صورت رمزنگاری ثابت کرد که تراکنش از فرستنده آمده و به شبکه ارسال شده است.

The data field

The vast majority of transactions access a contract from an externally-owned account. Most contracts are written in Solidity and interpret their data field in accordance with the application binary interface (ABI).

The first four bytes specify which function to call, using the hash of the function's name and arguments. You can sometimes identify the function from the selector using this database(opens in a new tab).

The rest of the calldata is the arguments, encoded as specified in the ABI specs(opens in a new tab).

For example, lets look at this transaction(opens in a new tab). Use Click to see More to see the calldata.

The function selector is 0xa9059cbb. There are several known functions with this signature(opens in a new tab). In this case the contract source code(opens in a new tab) has been uploaded to Etherscan, so we know the function is transfer(address,uint256).

The rest of the data is:

10000000000000000000000004f6742badb049791cd9a37ea913f2bac38d01279
2000000000000000000000000000000000000000000000000000000003b0559f4
3

According to the ABI specifications, integer values (such as addresses, which are 20-byte integers) appear in the ABI as 32-byte words, padded with zeros in the front. So we know that the to address is 4f6742badb049791cd9a37ea913f2bac38d01279(opens in a new tab). The value is 0x3b0559f4 = 990206452.

انواع تراکنش‌ها

در اتریوم چند نوع مختلف تراکنش وجود دارد:

  • تراکنش‌های منظم: تراکنش از یک کیف پول به کیف پولی دیگر.
  • تراکنش‌های استقرار قرارداد: تراکنش بدون آدرس «to»، که در آن از فیلد داده‌ها برای کد قرارداد استفاده می‌شود.
  • Execution of a contract: a transaction that interacts with a deployed smart contract. In this case, 'to' address is the smart contract address.

درباره‌ی گاز

همان‌طور که گفته شد، انجام تراکنش‌ها گاز مصرف می‌کند. تراکنش‌های انتقال ساده به 21000 واحد گاز نیاز دارند.

بنابراین برای اینکه باب 1 اتر را به آلیس با baseFeePerGas 190 gwei و maxPriorityFeePerGas 10 gwei ارسال کند، باب باید هزینه‌ی زیر را بپردازد:

1(190 + 10) * 21000 = 4,200,000 gwei
2--or--
30.0042 ETH
4

حساب باب 1.0042- اتر بدهکار خواهد شد

به حساب آلیس 1.0+ اتر بستانکار خواهد شد

کارمزد پایه 0.00399- اتر خواهد شد

استخراج‌گر 0.000210+ اتر را نگه می‌دارد

گاز برای هر تعامل قرارداد هوشمند نیز لازم است.

شکلی نشان‌دهنده‌ی نحوه‌ی بازپرداخت گاز مصرف‌نشده (opens in a new tab) نمودار برگرفته از Ethereum EVM illustrated(opens in a new tab)

هر گازی که در تراکنش استفاده نشده باشد به حساب کاربری مسترد می‌شود.

چرخه‌ی حیات تراکنش

هنگامی که تراکنش ارسال شد، موارد زیر اتفاق می‌افتد:

  1. وقتی یک تراکنش را ارسال می‌کنید، رمزنگاری یک هش تراکنش ایجاد می‌کند: 0x97d99bc7729211111a21b12c933c949d4f31684f1d6954ff477d0477538ff017
  2. تراکنش سپس به شبکه پخش می‌شود و در یک استخر با بسیاری از تراکنش‌های دیگر گنجانده می‌شود.
  3. یک استخراج‌گر باید تراکنش شما را انتخاب کند و آن را در یک بلوک قرار دهد تا تراکنش را تأیید کند و آن را «موفق» در نظر بگیرد.
    • اگر شبکه مشغول باشد و استخراج‌گرها قادر به ادامه دادن نباشند، ممکن است در این مرحله منتظر بمانید.
  4. تراکنش شما «تأییدات» را دریافت خواهد کرد. تعداد تأییدیه‌ها برابر با تعداد بلوک‌های ایجاد شده از زمان بلوکی است که شامل تراکنش شما می‌شود. هرچه این عدد بیشتر باشد، نشان دهنده‌ی اطمینان بیشتر از پردازش و شناسایی تراکنش توسط شبکه خواهد بود.
    • بلوک‌های اخیر ممکن است دوباره سازماندهی شوند و این تصور را ایجاد کنند که تراکنش ناموفق بوده است. با این حال، تراکنش ممکن است همچنان معتبر باشد اما در بلوک دیگری گنجانده شود.
    • احتمال سازماندهی مجدد با استخراج هر بلوک بعدی کاهش می‌یابد، یعنی هر چه تعداد تأییدات بیشتر باشد، تراکنش تغییرناپذیرتر است.

یک نسخه‌ی آزمایشی تصویری

آستین را تماشا کنید که شما را درباره‌ی تراکنش‌ها، گاز و استخراج راهنمایی می‌کند.

پاکت تراکنش تایپ‌شده

اتریوم در ابتدا یک قالب برای تراکنش‌ها داشت. هر تراکنش حاوی نانش (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) نوعی از تراکنش را تعریف می‌کند که پوششی برای انواع تراکنش‌های آینده است.

EIP-2718 یک پاکت جدید تعمیم یافته برای تراکنش‌های تایپ‌شده است. در استاندارد جدید، تراکنش‌ها به صورت زیر تفسیر می‌شوند:

TransactionType || TransactionPayload

که در آن فیلدها به صورت زیر تعریف می‌شوند:

  • TransactionType - عددی بین 0 و 0x7f، برای مجموع 128 نوع تراکنش ممکن.
  • TransactionPayload - یک آرایه‌ی بایت دلخواه که توسط نوع تراکنش تعریف شده است.

بیشتر بخوانید

آیا منبعی اجتماعی می‌شناسید که به شما کمک کرده باشد؟ این صفحه را ویرایش کنید و آن را اضافه کنید!

آیا این مقاله مفید بود؟