СМАРТ КОНТРАКТЫ | 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-Канале