В этой статье рассказывается, как разработать DApp Web3 с использованием Python, Brownie, Solidity и другого вспомогательного программного обеспечения. Это приложение в основном может использовать Crypto, чтобы разыграть счастливую ничью через сети блокчейн. Это похоже на любую игру с розыгрышем, где хозяин может организовать лотерею, а игроки, которые заплатят за нее и присоединятся, могут случайным образом выиграть приз или нет.
Ингредиенты полномасштабной разработки Web3 DApp
Python, Brownie, Solidity, Openzeppelink, Ethereum, Ganache-CLI, MetaMask, Alchemy, Chainlink, Etherscan
Оглавление по образцу заявки на участие в лотерее
- Разработайте смарт-контракт с использованием Solidity и Chainlink, Openzeppelink
- Основное развертывание и вспомогательные сценарии Python в приложении для лотереи
- Добавьте тестовые контракты Mock, VRF и Link Token
- Остальные критические компоненты — конфигурация YAML и env
- Модульное тестирование
- Подключите аутентичную сеть и оживите ее
- Полный скрипт Python и Solidity для полномасштабного децентрализованного приложения Web3 — кейс для лотереи
Разработайте смарт-контракт, используя Solidity и Chainlink
Вот основной поток в Lottery DApp, интегрированном с несколькими сетями, следующим образом:
- Пользователи могут войти в лотерейный фонд
- Лотерея начинается и заканчивается автоматически
- Приложение может случайным образом выбрать победителя
Есть несколько обязательных частей, которыми можно поделиться с точки зрения логики разработки DApp в смарт-контракте.
1. Создайте логический поток лотереи в смарт-контракте Solidity, добавив функции
В лотерейном смарт-контракте игровое путешествие в основном включает как минимум
- Введите сумму в валюте
- Получить комиссию за транзакцию
- Начать лотерею
- Завершить лотерею
- Выполнить функцию случайности
2. Протестируйте функцию смарт-контракта лотереи, создав mainnet-fork env
и тестовый скрипт.
Прежде чем говорить о пункте 2, обратите внимание на прагму 0.8, в которой msg.sender
больше не оплачивается автоматически. Поэтому вам нужно сначала сделать его подлежащим оплате следующим образом:
players.push(payable(msg.sender));
Чтобы добавить тестовую mainnet-fork network
в локальной среде, здесь мы используем Alchemy в качестве хоста.
Просто введите этот список команд в терминал:
brownie networks add development main net-fork cmd=ganache-cli host=http://127.0.0.1 fork=https://eth-mainnet.g.alchemy.com/v2/abcabc accounts=10 mnemonic=brownie port=8545
Возьмем, к примеру, функцию getEntraceFee. Вот результат теста, выполнившего brownie test –network mainnet-fork
Чтобы получить сценарий тестирования, подпишитесь на нашу рассылку новостей Easy2Digital, оставив сообщение «Учебник по полному сценарию Web3.0 DApp 5», которое мы отправим вам в ближайшее время.
3. Добавьте оператор ENUM
Для лотереи нам нужно настроить три сценария: лотерея открытая, закрытая и вычисление победителя. Вот код следующим образом:
enum LOTTERY_STATE {
OPEN,
CLOSED,
CALCULATING_WINNER
}
LOTTERY_STATE public lottery_state;
Затем для начала любой лотереи нам нужны только владельцы, которые могут сделать вызов, а не любые игроки, имеющие право делать это. Для этого мы можем импортировать sol владельца смарт-контракта, используя open zeppelin.
import "@openzeppelin/contracts/access/Ownable.sol";
function startLottery() public onlyOwner {
require(lottery_state == LOTTERY_STATE.CLOSED, "Can't start a new lottery yet!")
lottery_state = LOTTERY_STATE.OPEN;
};
И brownie-config.yaml
, пожалуйста, убедитесь, что вы используете последнюю открытую версию Zeppelin. Например, у меня 4.8.0
- OpenZeppelin/openzeppelin-contracts@4.8.0
4. Случайность
После того, как лотерея началась, необходимо случайным образом сгенерировать исход. Таким образом, нам нужен пакет случайных чисел для выполнения этой функции и доставки результата.
import "@chainlink/contracts/src/v0.8/VRFConsumerBase.sol";
Основываясь на функциях и параметрах случайности, нам нужно обратиться к ним и развернуть в смарт-контракте. Ниже перечислены места, которые необходимо обновить следующим образом:
Contract -> для добавления VRFConsumerBase в функцию лотереи
In the contract, we need to add some global variables as follows:
address payable[] public players;
address payable public recentWinner;
uint256 public randomness;
uint256 public fee;
bytes32 public keyhash;
Конструктор → добавить следующим образом:
contract Lottery is VRFConsumerBase, Ownable {
address payable[] public players;
address payable public recentWinner;
uint256 public randomness;
uint256 public usdEntryFee;
AggregatorV3Interface internal ethUsdPriceFeed;
enum LOTTERY_STATE {
OPEN,
CLOSED,
CALCULATING_WINNER
}
LOTTERY_STATE public lottery_state;
uint256 public fee;
bytes32 public keyhash;
constructor(
address _priceFeedAddress,
address _vrfCoordinator,
address _link,
uint256 _fee,
bytes32 _keyhash
) public VRFConsumerBase(_vrfCoordinator, _link) {
usdEntryFee = 50 * (10**18);
ethUsdPriceFeed = AggregatorV3Interface(_priceFeedAddress);
lottery_state = LOTTERY_STATE.CLOSED;
fee = _fee;
keyhash = _keyhash;
}
Скомпилировано!!
Основное развертывание и вспомогательные сценарии Python в приложении для лотереи
В этом приложении для лотереи можно развернуть несколько основных сценариев Python. Вот подробности следующим образом:
1. Основной скрипт, например, deploy_lottery.py на элемент выборки аккаунтов, сети, кошельков и тд и тп.
1) Идентификатор учетной записи и граббер
В настоящей лотерее люди могут использовать разные типы учетных записей, чтобы присоединиться и играть. Таким образом, основной сценарий должен иметь возможность определять учетную запись, которую используют пользователи, включая сеть. Вот пример кода следующим образом:
def deploy_lottery():
account = get_account(id="easy2digitalAccount")
2) Контракт, сети, идентификатор кошелька и граббер
lottery = Lottery.deploy(
get_contract ( "eth_usd_price_feed" ).address,
get_contract ( "vrf_coordinator" ).address,
get_contract ( "link_token" ).address,
config[ "networks" ][network.show_active()][ "fee" ],
config[ "networks" ][network.show_active()][ "keyhash" ],
{ "from" : account },
publish_source =config[ "networks" ][network.show_active()].get(
"verify" , False ),
)
3) Функции начала лотереи, ввода платы и окончания
За исключением функции развертывания, также необходимо иметь функции запуска, входа и завершения в скрипте Python, который работает со смарт-контрактом лотереи.
-
start_lottery()
-
enter_lottery()
-
end_lottery()
Возьмем для примера start_lottery()
def start_lottery ():
account = get_account ()
lottery = Lottery[- 1 ]
starting_tx = lottery .startLottery({ "from" : account })
starting_tx .wait( 1 )
print ( "The lottery has started!!" )
2. scriptAssistant.py
Что касается этого вспомогательного файла Python, он используется для поддержки выполнения сценария развертывания Python. Импортируем их в начале скрипта развертывания:
from scripts.scriptAssistant import get_account, get_contract, fund_with_link
-
get_account()
-
get_contract()
-
deploy_mocks()
-
fund_with_links()
Возьмем, к примеру, функцию Get_account.
def get_account(index=None, id=None):
if index:
return accounts[index]
if id:
return accounts.load(id)
if (
network.show_active() in LOCAL_BLOCKCHAIN_ENVIRONMENTS or network.show_active(
) in FORKED_LOCAL_ENVIRONMENTS
):
return accounts[0]
Добавьте контракты Mock, VRF и Link Token Test.
На основе конструктора смарт-контрактов для создания приложения лотереи нам нужны некоторые внешние ресурсы для интеграции с нашим приложением. В этой статье мы используем Chainlink в качестве примера ресурса. Ниже приведены 5 компонентов, которые нам понадобятся:
- Адрес фида цен
- Координатор ВРФ
- Токен ссылки
- Ключ Хэш
- Сборы
Нам нужно перейти на Chainlink GitHub, чтобы скопировать последнюю версию и вставить ее в папку с контрактами отдельно. Образец выглядит следующим образом:
Чтобы узнать адрес подачи цен, ключ токена ссылки, хэш ключа и комиссию, перейдите на официальный сайт Chainlink и найдите соответствующую информацию.
Остальные критические компоненты — конфигурация YAML и env
Остальные ключевые компоненты — это YAML-файл конфигурации домового и файл env. Для получения более подробной информации, пожалуйста, ознакомьтесь с предыдущей статьей о смарт-контракте fund-me. По сути, настройка такая же, как и в лотерейном приложении, о котором мы сейчас говорим.
Смарт-контракт Brownie FundMe развернут на Ethereum с использованием Python и Web3
Модульное тестирование
Как упоминалось в предыдущих статьях, одна из самых мощных функций, предоставленных Brownie, — это тестовая среда. Без сомнения, мы не хотим запускать приложение, пока не подтвердим, что все готово. Таким образом, тестирование является обязательным этапом любого DApp, которое вы разрабатываете.
Что касается компонентов тестирования, в основном нам нужно следовать шагам смарт-контракта и тестировать их один за другим. Вот 5 шагов следующим образом:
-
test_get_entrance_fee()
-
test_cant_enter_unless_starter()
-
test_can_enter_unless_starter()
-
test_can_end_lottery()
-
test_can_pick_winner_correctly()
Возьмем, к примеру test_get_entrance_fee()
def test_get_entrance_fee():
if network.show_active() notinLOCAL_BLOCKCHAIN_ENVIRONMENTS:
pytest.skip()
# Arrange
lottery = deploy_lottery()
# Act
expected_entrance_fee = Web3.toWei(0.025, "ether")
entrance_fee = lottery.getEntranceFee()
# Assert
assertexpected_entrance_fee == entrance_fee
Подключите аутентичную сеть и оживите ее
Как только тестирование будет завершено и все пойдет хорошо, пришло время подключить настоящую сеть и запустить ее! Для получения более подробной информации, пожалуйста, ознакомьтесь с предыдущей статьей об использовании Infura и MetaMask для развертывания на Ethereum.
Полный скрипт Python и Solidity полномасштабного децентрализованного приложения Web3 — приложение для лотереи
Если вас интересует полный набор скриптов Web3 DApp Lottery,пожалуйста , подпишитесь на нашу рассылку , добавив сообщение «Учебник Web3.0 5» . Мы отправим вам сценарий немедленно на ваш почтовый ящик.
Надеюсь, вам понравится читать Полномасштабная разработка DApp Web3 с использованием Python и Brownie — Lottery. Если вы это сделали, пожалуйста, поддержите нас, выполнив одно из перечисленных ниже действий, потому что это всегда помогает нашему каналу.
- Поддержите и пожертвуйте мой канал через PayPal ( paypal.me/Easy2digital )
- Подпишитесь на мой канал и включите колокольчик уведомлений канала Easy2Digital Youtube .
- Подписывайтесь и лайкайте мою страницу Страница Easy2Digital в Facebook
- Поделитесь статьей в своей социальной сети с хэштегом #easy2digital
- Вы подписываетесь на нашу еженедельную рассылку, чтобы получать последние статьи, видео и коды скидок Easy2Digital.
- Подпишитесь на наше ежемесячное членство через Patreon, чтобы пользоваться эксклюзивными преимуществами ( www.patreon.com/louisludigital )