Зависимости
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. Чтобы вызвать публичную функцию 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, мы найдем там две записи о транзакциях,
- Первая транзакция связана с созданием контракта.
- Во второй транзакции мы вызываем функцию 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/
СВЯЗАТЬСЯ СО МНОЙ
Надеюсь, вы нашли эту статью полезной. Спасибо за прочтение!