Перейти к основному содержанию

Помогите обновить эту страницу

🌏

Есть новая версия этой страницы, но пока только на английском языке. Помогите нам перевести последнюю версию.

Перевести страницу
См. английский

Здесь нет ошибок!🐛

Эта страница сейчас не переводится. Пока что мы намеренно оставили эту страницу на английском языке.

Транзакции

Последнее редактирование: , Invalid DateTime
Редактировать страницу

Транзакции — это криптографически подписанные инструкции от аккаунтов. Аккаунт инициирует транзакцию для обновления состояния сети Ethereum. Самая простая транзакция — перевод ETH с одного аккаунта на другой.

Прежде чем начать

Чтобы помочь вам лучше понять эту страницу, мы рекомендуем сначала прочитать разделы Аккаунты и наше Введение в Ethereum.

Что такое транзакция?

Транзакция Ethereum относится к действию, инициированному внешним аккаунтом, то есть аккаунтом, управляемым человеком, а не контрактом. Например, если Боб отправляет Алисе 1 ETH, аккаунт Боба должен быть дебетован, а счет Алисы — кредитован. Это действие по изменению состояния происходит внутри транзакции.

Диаграмма, показывающая изменение состояния из-за транзакции Диаграмма адаптирована к Ethereum EVM иллюстрирована

Транзакции, которые изменяют состояние EVM, должны транслироваться по всей сети. Любой узел может транслировать запрос на выполнение транзакции в EVM; после этого майнер выполнит транзакцию и распространит полученное изменение состояния на остальную часть сети.

Транзакции требуют комиссии и должны быть добыты, чтобы стать действительными. Чтобы упростить этот обзор, мы рассмотрим газовые комисии и майнинг в другом месте.

Отправленная транзакция включает следующую информацию:

  • recipient — адрес получателя (если аккаунт внешний, транзакция будет передавать стоимость. Если это аккаунт контракта, транзакция выполнит код контракта).
  • signature — идентификатор отправителя. Он генерируется, когда закрытый ключ отправителя подписывает транзакцию и подтверждает, что отправитель авторизовал эту транзакцию.
  • value — количество ETH для перевода от отправителя к получателю (в WEI, номинал ETH).
  • 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
Показать все
📋 Копировать

Но объект транзакции должен быть подписан с использованием приватного ключа отправителя. Это доказывает, что транзакция могла исходить только от отправителя и не была отправлена ​​обманным путем.

Клиент Ethereum, такой как 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}
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 — это подписанная транзакция в кодированной форме Recursive Length Prefix (RLP)
  • tx — это подписанная транзакция в форме JSON

С помощью хэша подписи можно криптографически доказать, что транзакция пришла от отправителя и была отправлена ​​в сеть.

Поле данных

В подавляющем большинстве операций доступ к контракту осуществляется с внешнего аккаунта. Большинство контрактов написаны на Solidity и интерпретируют свое поле данных в соответствии с бинарным интерфейсом приложения (ABI).

Первые четыре байта указывают, какую функцию следует вызвать, используя хэш имени функции и ее аргументов. Иногда можно определить функцию по селектору, используя эту базу данных.

Остальная часть calldata — это аргументы, закодированные в соответствии со спецификациями ABI.

Например, рассмотрим эту транзакцию. Чтобы увидеть calldata, используйте Нажмите, чтобы увидеть больше.

Селектор функции — 0xa9059cbb. Существует несколько известных функций с такой сигнатурой. В этом случае исходный код контракта был загружен в Etherscan, поэтому мы функцию: transfer(address, uint256).

Остальные данные таковы:

10000000000000000000000004f6742badb049791cd9a37ea913f2bac38d01279
2000000000000000000000000000000000000000000000000000000003b0559f4
3

Согласно спецификациям ABI целочисленные значения (такие как адреса, которые являются 20-байтовыми целыми числами) отображаются в ABI как 32-байтовые слова, заполненные нулями спереди. Итак, мы знаем адрес to: 4f6742badb049791cd9a37ea913f2bac38d01279. Значение value равно 0x3b0559f4 = 990206452.

Типы транзакций

В Ethereum существует несколько различных типов транзакций:

  • Обычные транзакции: транзакция с одного кошелька на другой.
  • Транзакции развертывания контракта: транзакция без адреса «to», где поле данных используется для кода контракта.
  • Исполнение контракта: транзакция, которая взаимодействует с развернутым умным контрактом. В этом случае адрес «to» — это адрес умного контракта.

О газе

Как уже упоминалось, выполнение транзакций требует затрат газа. Для простых транзакций перевода требуется 21 000 единиц газа.

Таким образом, чтобы Боб отправил Алисе 1 ETH с baseFeePerGas 190 gwei и maxPriorityFeePerGas 10 gwei, Бобу необходимо будет заплатить следующую комиссию:

1(190 + 10) * 21 000 = 4 200 000 gwei
2--или--
30,0042 ETH
4

Со счета Боба будет списано -1,0042 ETH

На счет Алисы будет зачислено +1,0 ETH

Сжигаемая базовая комиссия составит -0,00399 ЕТН

Майнер удержит +0,000210 ETH

Газ также необходим для любого взаимодействия с умными контрактами.

Схема, показывающая, как возвращается неиспользованный газ Источник адаптированной диаграммы: Ethereum EVM illustrated

Любой газ, не использованный в транзакции, возвращается в аккаунт пользователя.

Жизненный цикл транзакции

После отправки транзакции происходит следующее:

  1. После отправки транзакции криптография генерирует хэш транзакции: 0x97d99bc7729211111a21b12c933c949d4f31684f1d6954ff477d0477538ff017
  2. Затем транзакция транслируется в сеть и включается в пул с множеством других транзакций.
  3. Чтобы подтвердить транзакцию и считать ее «успешной», майнер должен выбрать вашу транзакцию и включить ее в блок.
    • На этом этапе вам, возможно, придется подождать, если сеть занята, а майнеры не запаздывают.
  4. Ваша транзакция получает «подтверждение». Количество подтверждений — это количество блоков, созданных с момента блока, в который была включена ваша транзакция. Чем выше это число, тем больше вероятность того, что сеть обработала и распознала транзакцию.
    • Недавние блоки могут быть реорганизованы, создавая впечатление, что транзакция не была удачной; однако транзакция может быть действительной, но включенной в другой блок.
    • Вероятность реорганизации уменьшается с каждым последующим добытым блоком, т. е. чем больше количество подтверждений, тем более неизменной становится транзакция.

Визуализация

Посмотрите, как Остин рассказывает о транзакциях, газе и майнинге.

Типизированная оболочка транзакций

Ethereum изначально имел один формат транзакций. Каждая транзакция содержала значение nonce, цену на газ, лимит газа, адрес, значение, данные, v, r и s. Эти поля закодированы RLP и выглядели примерно так:

RLP([nonce, gasPrice, gasLimit, to, value, data, v, r, s])

Ethereum эволюционировал для поддержки нескольких типов транзакций, чтобы реализовать новые функции, такие как списки доступа и EIP-1559, без влияния на старые форматы транзакций.

EIP-2718: типизированная оболочка транзакции определяет тип транзакции, который является основой для будущих типов транзакций.

EIP-2718 — это новая универсальная оболочка для типизированных транзакций. В новом стандарте транзакции интерпретируются как:

TransactionType || TransactionPayload

Где поля определяются как:

  • TransactionType: число между 0 и 0x7f, в общей сложности 128 возможных типов транзакций.
  • TransactionPayload — произвольный байтовый массив, определяемый типом транзакции.

Дополнительные ресурсы

Знаете ресурс сообщества, который вам пригодился? Измените эту страницу и добавьте его!

Была ли эта статья полезной?

👈

Предыдущие

Аккаунты

Следующий

Блоки
👉