Частые фейлы при создании транзакции 🧠
В этом посте мы рассмотрим частые ошибки новичков при создании транзакций. Они могут показаться банальными, но ты не поверишь сколько челов факапятся именно на этих моментах. И ладно, когда они просто не дают тебе провести транзакцию, некоторые ошибки могут привести даже к потери кэша.
Определения терминов, которые мы будем использовать далее:
RPC (Remote Procedure Call) – механизм, позволяющий одной программе вызывать функции или запрашивать данные на другом сервере, как если бы они выполнялись локально. В контексте блокчейна RPC используется для взаимодействия с узлом сети (например, отправка транзакций, получение данных о блоках и балансах адресов).
EIP-1559 – предложение по улучшению Ethereum, изменяющее механизм ценообразования газа. Введено в обновлении London, включает базовую комиссию, которая сжигается, и приоритетную комиссию для ускорения транзакций. Это улучшает прогнозируемость и стабильность комиссий.
Legacy-транзакция – традиционный тип транзакций в Ethereum до EIP-1559, где пользователи указывают только gasPrice. После внедрения EIP-1559 такие транзакции обозначаются как "Type 0" или "legacy" и остаются совместимыми с сетью.
1. Использование неправильного RPC ⚠️
Одна из распространённых ошибок — поиск RPC-узла для Ethereum и выбор первого попавшегося. Например, ты хочешь отправить транзакцию в Ethereum Mainnet, но случайно берёшь RPC от тестовой сети (например, Goerli). В таком случае, даже если ты правильно указал chain_id=1 (Mainnet), узел не примет транзакцию, потому что она не соответствует сети
2. Ошибка в chain_id 🔗
Обратная ситуация — у тебя подключён Ethereum Mainnet, но ты не знаешь, какой chain_id указать. Ты находишь информацию в интернете или спрашиваешь у знакомых, и тебе говорят, что нужен chain_id=5. Однако 5 — это идентификатор Goerli, а для Mainnet нужен chain_id=1. В результате транзакция фейлится, потому что chain_id должен точно совпадать с сетью, к которой ты подключён
3. Не рассчитать цену за газ ⛽️
При создании транзакции нужно корректно рассчитать цену за газ. Самой тупой ошибкой, может быть вписать туда фиксированные данные, без расчета через код.
transaction = {
"nonce": w3.eth.get_transaction_count("0xYourAddress"),
"to": "0xRecipientAddress",
"value": w3.to_wei(0.01, "ether"),
"gas": 21000,
"gasPrice": w3.to_wei(0.0001, "gwei"), # Слишком низкая цена за газ
"chainId": 1,
}
В таких случаях твоя транзакция может либо зависнуть, либо ты переплатишь за газ.
4. Использовать legacy транзакции 🐢
Если ты используешь legacy транзакции, как мы это показали в предыдущем примере, то тебя точно побреют проекты. Лучше использовать современный стандарт в виде EIP 1559.
transaction = {
"nonce": w3.eth.get_transaction_count("0xYourAddress"),
"to": "0xRecipientAddress",
"value": w3.to_wei(0.01, "ether"),
"gas": 21000,
"maxPriorityFeePerGas": w3.to_wei(2, "gwei"),
"maxFeePerGas": w3.to_wei(50, "gwei"),
"chainId": 1,
}
# получаем базовую цену газа и приоритетную комиссию
base_fee = w3.eth.gas_price
max_priority_fee_per_gas = w3.eth.max_priority_fee
max_fee_per_gas = base_fee + max_priority_fee_per_gas
# записываем расчеты в транзакцию
transaction["maxPriorityFeePerGas"] = max_priority_fee_per_gas
transaction["maxFeePerGas"] = int(max_fee_per_gas * 1.5)
# оцениваем лимит газа
gas_estimate = w3.eth.estimate_gas(transaction)
transaction["gas"] = int(gas_estimate * 1.5)
5. Не дождаться выполнения транзакции 👀
Когда у тебя простая транзакция и ты в ней уверен, например, это может быть простым переводом с одного кошелька на другой, то можно не дожидаться выполнения. А если у тебя что-то сложнее? Может быть такое, что ты отправишь транзакцию, а спустя время она будет отменена (transaction reverted).
Бро, это мы рассказали тебе лишь 1/4 часть ОДНОГО урока, представь сколько еще будет на самом обучении. Ты еще успеваешь
записаться к нам, продажи открыты до 17 февраля.
Пиши в комментах с какими ошибками сталкивался ты (можно не только по транзакциям) ⤵️
AIO Study |
Site