Как развернуть смарт-контракт на блокчейне с помощью Python


Зависимости

Python

web3.py :
Web3.py — это библиотека Python для взаимодействия с Ethereum.

Она часто встречается в децентрализованных приложениях (dapp), помогая отправлять транзакции, взаимодействовать со смарт-контрактами, читать данные блоков и выполнять множество других задач.

Установка:

pip install web3

Py-solc-x | Py-solc :

Py-solc — это обертка Python и инструмент управления версиями для компилятора solc Solidity.

Установка:

pip install py-solc-x

Ganache UI | Cli

Установка:

  • Ganache DesktopСсылка для скачивания

    ИЛИ
  • Ganache-cli : pip install ganache-cli

Приступайте к работе

1. Откройте каталог, в который вы поместили свой смарт-контракт, в редакторе кода, например VSCode.

2. Создайте файл solidity SmartContractDemo.sol.

// SPDX-License-Identifier: MIT

pragma solidity ^0.6.0;

contract SmartContractDemo {
    struct Person {
        string name;
        string dateOfBirth;
    }

    Person[] public idCard;

    function numberOfEntries() public view returns (uint256) {
        return idCard.length;
    }

    function store(string memory _name, string memory _birthday) public {
        idCard.push(Person(_name, _birthday));
    }

    function changeData(
        uint256 index,
        string memory _name,
        string memory _birthday
    ) public {
        require(index <= numberOfEntries(), "Given index not present");
        idCard[index] = Person(_name, _birthday);
    }

    function retrieve(uint256 index)
        public
        view
        returns (string memory, string memory)
    {
        require(index <= numberOfEntries(), "Given index not present");
        return (idCard[index].name, idCard[index].dateOfBirth);
    }
}
Войдите в полноэкранный режим Выйдите из полноэкранного режима

3. Далее создайте python-файл deploy.py. Здесь мы напишем код, необходимый для размещения нашего контракта в блокчейне.

4. Сначала добавьте приведенный ниже код для импорта web3 и py-solc-x в файлы python:

from web3 import Web3
from solcx import compile_standard, install_solc

import json
Войти в полноэкранный режим Выйти из полноэкранного режима

5. Прочитайте и сохраните содержимое файла SmartContractDemo.sol в отдельной переменной:

# extract the content of SmartContractDemo.sol
with open("./SmartContractDemo.sol", "r") as file:
    smart_contract_demo = file.read()
Войти в полноэкранный режим Выйти из полноэкранного режима

6. Запустите приведенный ниже код для установки solc и компиляции кода solidity:

install_solc("0.6.0")

# Solidity source code
compiled_sol = compile_standard(
    {
        "language": "Solidity",
        "sources": {"SmartContractDemo.sol" : { "content" : smart_contract_demo_file }},
        "settings": {
            "outputSelection": {
                "*": {
                    "*": ["abi","metadata","evm.bytecode","evm.sourceMap"]
                }
            }
        }
    },
    solc_version="0.6.0",
)
Войти в полноэкранный режим Выйти из полноэкранного режима

7. Приведенный ниже код поместит скомпилированный_код в новый JSON-файл.

with open("compiled_code.json","w") as file:
    json.dump(compiled_sol,file)
Войти в полноэкранный режим Выйти из полноэкранного режима

8. Теперь, прежде чем мы развернем этот контракт, нам сначала нужны abi и байткод, которые мы можем получить из compiled_code. Этого можно достичь с помощью данного кода:

# get abi
abi = compiled_sol["contracts"]["SmartContractDemo.sol"]["SmartContractDemo"]["abi"]

# bytecode
bytecode = compiled_sol["contracts"]["SmartContractDemo.sol"]["SmartContractDemo"]["evm"]["bytecode"]["object]
Войти в полноэкранный режим Выйти из полноэкранного режима

9. Подключение к Ganache:

Для подключения к ganache нам нужен URL HTTP-провайдера, chain-id, открытый ключ и закрытый ключ, который будет использоваться для развертывания нашего смарт-контракта.

Как получить HTTP-провайдера, chain-id, публичный и приватный ключ счета транзакции:

Если вы используете Ganache UI

Шаг 1: Откройте приложение Ganache.

Шаг 2: Нажмите на кнопку Quickstart.

Вот как выглядит Ganache-UI

  • Белое поле дает нам RPC-сервер, т.е. http://127.0.0.1:7545.
  • Желтое поле обозначает chain_id, т.е. 5777.
  • Красное поле обозначает открытый ключ аккаунта, например, 0xE1584b4d8f1b0CeEF97190B296DaF446674A3d63.
  • Синяя рамка, указывающая на кнопку, покажет закрытый ключ, связанный с данной учетной записью

или

Если вы используете Ganache-CLI

Шаг 1: Откройте терминал и выполните указанную команду: ganache-cli.

Это приведет к запуску терминала ganache-cli.

Шаг 2: Скопируйте и запишите открытый и закрытый ключ, связанный с любой учетной записью, clain-id и url сервера RPC, который в моем случае http://127.0.0.1:8545.

Важное замечание:

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

10. Управление закрытым ключом

Добавление закрытого ключа:

Даже если мы просто используем закрытый ключ, связанный с ganache, для лучшей практики мы всегда должны избегать жесткого кодирования закрытого ключа в нашем коде.

Поэтому для хранения приватного ключа мы добавим его в качестве переменной окружения и извлечем его в нашей python-программе deploy.py с помощью модуля OS.

Для этого :

  • Внутри той же директории добавьте файл .env.
  • Откройте файл .env и напишите: export $PRIVATE_KEY=<вставьте сюда свой закрытый ключ>например,![[Вставленное изображение 20220523145104.png]].
  • Вернитесь к deploy.py и импортируйте этот модуль в верхней части:![[Вставленное изображение 20220523145413.png]].

11. Вернитесь к нашему deploy.py и соедините его с ganache.

# Connecting to ganache
w3 = Web3(Web3.HTTPProvider("http://127.0.0.1:8545"))
chain_id = 5777
my_address= "0xE1584b4d8f1b0CeEF97190B296DaF446674A3d63"
private_key = os.getenv("PRIVATE_KEY")
Войдите в полноэкранный режим Выходим из полноэкранного режима

12. Теперь давайте создадим контракт в python и получим последнюю транзакцию.

# Creating contract in python
SmartContractDemo = w3.eth.contract(abi=abi, bytecode=bytecode)

# Get the latest transaction
transaction = SmartContractDemo.constructor().buildTransaction({
    "chainId": chain_id,
    "gasPrice": w3.eth.gas_price,
    "from": my_address,
    "nonce": nonce,
})
Войти в полноэкранный режим Выйти из полноэкранного режима

13. Наконец, давайте подпишем нашу транзакцию и развернем ее.

# Sign the transaction
signed_txn = w3.eth.account.sign_transaction(transaction, private_key=private_key)

print("Deploying Contract!")
# Sent it
tx_hash = w3.eth.send_raw_transaction(signed_txn.rawTransaction)

# Wait for the transaction to be mined, and get the transaction receipt
print("Waiting for Transaction to finish...")

tx_receipt=w3.eth.wait_for_transaction_receipt(tx_hash)
print(f"Done! Contract Deployed to {tx_receipt.contractAddress}")
Войти в полноэкранный режим Выйти из полноэкранного режима

Отлично! Мы успешно научились развертывать смарт-контракт на локальном блокчейне.

Взаимодействие с нашим смарт-контрактом

Существует два типа взаимодействия с умным контрактом:

  1. Вызов -> Имитация выполнения вызова и получение возвращаемого значения.
  2. Транзакция -> Фактическое изменение состояния.

Давайте выполним оба вида взаимодействия с нашим смарт-контрактом:

1. Чтобы вызвать публичную функцию numberOfEnteries() из SmartContractDemo, вернитесь к deploy.py.

# Working with the contracts
smart_contract_demo = w3.eth.contract(address=tx_receipt.contractAddress, abi=abi)

print(f"Number of Enteries in idCard array is {smart_contract_demo.functions.numberOfEnteries()}")
Войдите в полноэкранный режим Выйдите из полноэкранного режима

2. Теперь измените состояние, добавив данные в массив idCard с помощью функции store():

store_transaction = smart_contract_demo.functions.store("Naruto", "10-10-1999").buildTransaction({
    "chainId": chain_id,
    "gasPrice": w3.eth.gas_price,
    "from":my_address,
    "nonce":nonce+1,
})

signed_store_txn = w3.eth.account.sign_transaction(
    store_transaction, private_key=private_key
)

signed_store_hash = w3.eth.send_raw_transaction(signed_store_txn.rawTransaction)

tx_receipt = w3.eth.wait_for_transaction_receipt(signed_store_hash)
Вход в полноэкранный режим Выход из полноэкранного режима

Каждый раз, когда мы изменяем состояние, транзакция должна быть сначала подписана нашим закрытым ключом.

Примечание:
Вызов представления или чистой публичной функции ничего не стоит.
В то время как развертывание смарт-контракта и вызов функции, которая изменяет состояние блокчейна, стоит некоторого количества GAS Fees.

3. Наконец, завершите его, снова вызвав функцию numberOfEnteries() и функцию retrieve().

print(f"Number of Enteries in idCard array is {smart_contract_demo.functions.numberOfEnteries()}")

print(f"Person at 0th index in idCard array is {smart_contract_demo.functions.idCard(0)}")
Вход в полноэкранный режим Выход из полноэкранного режима

4. Теперь запустите файл deploy.py (запустите через терминал: python ./deploy.py).

ВЫВОД:


Теперь, если мы проверим ganache-cli, мы найдем там две записи о транзакциях,

  1. Первая транзакция связана с созданием контракта.
  2. Во второй транзакции мы вызываем функцию store для добавления персональных данных в массив idCard.

Ссылка на ресурс

Ссылка на проект:

  • GitHub: https://github.com/subrotokumar/SmartContractDemo

Документация:

  • web3.py : https://web3py.readthedocs.io/en/stable/
  • py-solc-x : https://solcx.readthedocs.io/en/latest/

СВЯЗАТЬСЯ СО МНОЙ

Надеюсь, вы нашли эту статью полезной. Спасибо за прочтение!

Оцените статью
Procodings.ru
Добавить комментарий