СМАРТ КОНТРАКТЫ | Python edition
Сегодня Кратко Разберем Взаимодействие со смарт-контрактами на Python
План:
1. Что такое Смарт-Контракт?
Смарт-Контракт - программный код, который автоматически выполняет, контролирует и документирует выполнение условий соглашения между сторонами.
Он работает на блокчейне и выполняется, когда выполняются заранее определённые условия. Смарт-контракты гарантируют безопасность, прозрачность и автоматизацию, так как они не требуют посредников для исполнения условий контракта.
В блокчейне смарт-контракты могут использоваться для:
и других сервисов, позволяя выполнять операции по заранее заданным правилам, которые не могут быть изменены после их размещения в сети. Это делает блокчейн прозрачным, защищённым и автономным.
Более Подробно про смарт-контракты рассказал в этом видео
2. Что Необходимо
- Сеть (Mainnet, Ropsten, Rinkeby) или локальная сеть (Ganache или HardHat).
- Для публичной ноды используем сервисы (Infura или Alchemy) - они предоставляют API для работы с Ethereum.
- Смарт-контракт должен быть уже развернут на выбранной сети, и у вас должны быть его ABI (Application Binary Interface) и адрес. (ABI описывает функции контракта, которые можно вызвать, и типы данных, которые они используют.)
- Python + Web3Py библиотека
3. Код Скрипта
from web3 import web3
infuraURL = "https://mainnet.infura.io/v3/InfuraКлюч"
web3 = Web3(Web3.HTTPProvider(infuraURL))
if web3.is_connected():
print("Connected to Ethereum network ✅")
print(f"Current block number: {web3.eth.block_number}")
USDT_contract_address = web3.to_checksum_address("0xdac17f958d2ee523a2206206994597c13d831ec7")
contract_abi = [
{
"constant": True,
"inputs": [],
"name": "name",
"outputs": [{"name": "", "type": "string"}],
"payable": False,
"stateMutability": "view",
"type": "function"
},
{
"constant": True,
"inputs": [],
"name": "symbol",
"outputs": [{"name": "", "type": "string"}],
"payable": False,
"stateMutability": "view",
"type": "function"
},
{
"constant": True,
"inputs": [],
"name": "totalSupply",
"outputs": [{"name": "", "type": "uint256"}],
"payable": False,
"stateMutability": "view",
"type": "function"
},
{
"constant": True,
"inputs": [{"name": "_owner", "type": "address"}],
"name": "balanceOf",
"outputs": [{"name": "balance", "type": "uint256"}],
"payable": False,
"stateMutability": "view",
"type": "function"
},
{
"constant": True,
"inputs": [],
"name": "decimals",
"outputs": [{"name": "", "type": "uint8"}],
"payable": False,
"stateMutability": "view",
"type": "function"
}
]
contract = web3.eth.contract(address=USDT_contract_address, abi=contract_abi)
name = contract.functions.name().call()
symbol = contract.functions.symbol().call()
total_supply = contract.functions.totalSupply().call()
decimals = contract.functions.decimals().call()
# get readable total supply
readableTotalSupply = total_supply / (10 ** decimals)
formattedTotalSupply = "{:,.2f}".format(readableTotalSupply)
print(f"Name: {name}")
print(f"Symbol: {symbol}")
print(f"Total supply: {formattedTotalSupply}")
# check balance
addressMy = web3.to_checksum_address("0x5041ed759Dd4aFc3a72b8192C143F72f4724081A")
balance = contract.functions.balanceOf(addressMy).call()
readableBalance = balance / (10 ** decimals)
formattedBalance = "{:,.2f}".format(readableBalance)
print(f"Balance of {addressMy}: {formattedBalance} {symbol}")
else:
print("Failed to connect to Ethereum network ❌")4. Анализ
Процесс Выполнения Скрипта:
- Подключение web3py библиотеки
- Получение и подключение к Ethereum Ноде через API Infura
- Получение адреса USDT (доступен публично на etherscan)
- Форматирование Адреса USDT в checksum для избежания ошибок.
- Получение ABI смарт-контракта USDT, также на etherscan
- Создаём объект контракта в Ethereum, который позволяет взаимодействовать с конкретным смарт-контрактом. (переменная contract)
- Вызов функций смарт-контракта - name, symbol, total_supply, decimals
- Форматирование - процесс далее
- Считываем балланс кошелька OKX на количество USDT (вызываем balanceOf функцию) + форматируем
- Вывод баланса OKX адреса
checksum - используем для проверки точности и корректности данных, таких как адреса в сети Ethereum или другие идентификаторы.
decimals - функция смарт-контракта, которая возвращает количество знаков после запятой для токена. Например, для токенов ERC-20 это обычно 18.
Как форматируются балансы:
readableTotalSupply = total_supply / (10 ** decimals)
- Преобразуем общее количество токенов, хранящихся в переменной
total_supply, в более читаемый формат, принимая во внимание количество десятичных знаков, определённых функциейdecimals() total_supply— это общее количество токенов, но в реальности оно может быть задано с дополнительными десятичными знаками (например, для токенов ERC-20 это часто бывает 18 знаков после запятой).10 ** decimals— вычисляем число 10 (десятичые знаки), возведённое в степень, равную количеству десятичных знаков для токена. Например, если токен имеет 18 десятичных знаков, то результатом будет число1000000000000000000(то есть 10^18).total_supply / (10 ** decimals)— деление общего количества токенов на это число10 ** decimalsприводит к преобразованию величины в более привычный формат, в котором число имеет точность, соответствующую количеству десятичных знаков. Например, если в сети токенов 18 десятичных знаков, то для значения1000000000000000000результат будет1.0, что более интуитивно понятно.
formattedTotalSupply = "{:,.2f}".format(readableTotalSupply)форматирования числа в строку с двумя знаками после запятой и разделением разрядов с помощью запятой, что улучшает читаемость.
+ formattedTotalSupply обеспечит, что даже если число не имеет десятичных знаков, оно будет отображаться с двумя знаками после запятой, например, "1.00" вместо просто "1".
Теперь мы изучили смарт-контракты и освоили методы их интеграции с Python
все обновления по блокчейн-разработке в моем Telegram-Канале