Solidity

Function comparison

Видимость
Вызов из транзакции
Вызов из др. контракта
Вызов из своего контракта
Вызов из наследника
Gas (внутр.)
Gas (внешн.)
Примеры применения

public

низкий

высокий

API-функции, геттеры

external

через this.

через this.

высокий

Внешний интерфейс, большие calldata

internal

очень низкий

Вспомогательные, унаследованные функции

private

очень низкий

Локальные вспомогательные функции

Interaction with the contract

from web3 import Web3
import os

# Конфиг (рпц, приватный ключ от нашего EOA, адрес нашего EOA, адрес контракта )
INFURA_URL    = os.getenv('INFURA_URL')
PRIVATE_KEY   = os.getenv('PRIVATE_KEY')
FROM_ADDRESS  = Web3.to_checksum_address(os.getenv('FROM_ADDRESS'))
CONTRACT_ADDR = Web3.to_checksum_address(os.getenv('CONTRACT_ADDRESS'))

# Описание методов контракта
ABI = [
    {
        "inputs": [],
        "name": "lol",
        "outputs": [],
        "stateMutability": "nonpayable",
        "type": "function"
    }
]

#Подключаемся и создаем объект контракта
w3 = Web3(Web3.HTTPProvider(INFURA_URL))
if not w3.is_connected():
    raise ConnectionError("Failed to connect to ethereum node")

contract = w3.eth.contract(address=CONTRACT_ADDR, abi=ABI)


def someFunc():
    #Берем nonce для нашей транзакции
    nonce = w3.eth.get_transaction_count(FROM_ADDRESS)
    
    # Составляем саму транзакцию, вызываем функцию lol у контракта
    tx = contract.functions.lol().build_transaction({
        'from': FROM_ADDRESS,
        # Тут например могли передать value с переводом ethereum в wei
        #'value': w3.to_wei(amount_eth, 'ether'),
        'nonce': nonce,
        # Выставляем сколько готовы платить за газ
        'gas': 200000,
        'gasPrice': w3.to_wei('50', 'gwei')
    })
    
    # Подписываем и отправляем транзакцию
    signed_tx = w3.eth.account.sign_transaction(tx, PRIVATE_KEY)
    tx_hash = w3.eth.send_raw_transaction(signed_tx.raw_transaction)
    print(f"Tx sent: {tx_hash.hex()}")
    receipt = w3.eth.wait_for_transaction_receipt(tx_hash)
    print(f"Mined in block {receipt.blockNumber}")
    
if __name__ == "__main__":
    someFunc()

Last updated