使用 Python 和 Brownie 进行 Web3 DApp 全面开发

了解如何使用 Python、Brownie、Solidity 和其他辅助模块开发 Web3 DApp。以抽奖、彩票游戏为例

本文分享如何使用Python、Brownie、Solidity等辅助软件开发Web3 DApp。这个应用程序基本上可以使用加密货币通过区块链网络进行抽奖。这就像任何抽奖游戏一样,主持人可以设置彩票游戏,付费并加入的玩家可以随机中奖或不中奖。

Web3 DApp 全面开发的要素

Python、Brownie、Solidity、Openzeppelink、以太坊、Ganache-CLI、MetaMask、Alchemy、Chainlink、Etherscan

彩票应用程序示例的目录

使用 Solidity 和 Chainlink 开发智能合约

多网络融合的彩票DApp主要流程如下:

  • 用户可以输入彩票资金
  • 抽奖自动开始和结束
  • 该应用程序可以随机选择一名获胜者

关于智能合约中的DApp开发逻辑,有几个必要的部分需要分享。

1.通过添加函数在solidity智能合约中创建彩票逻辑流程

在彩票智能合约中,投注旅程基本上至少包括

  • 输入货币金额
  • 获取交易费
  • 开始抽奖
  • 结束抽奖
  • 实现随机性功能

2. 通过创建mainnet-fork env和测试脚本来测试彩票智能合约功能。

在讨论第 2 点之前,请务必注意 pragma 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;

然后,对于任何抽奖开始,我们只要求拥有者可以打电话,而不是任何游戏玩家都有权这样做。为此,我们可以使用 open zeppelin 导入智能合约所有者 sol。

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 ,请务必使用最新的 open 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脚本

在此 Lottery 应用程序中需要部署一些核心 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) 抽奖开始、费用录入、结束功能

摘录部署函数,在与 Lottery 智能合约配合使用的 Python 脚本中还需要有 start、entry 和 end 函数。

  • 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. 脚本助手.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]

添加模拟、VRF 和 Link Token 测试合约

基于构建彩票应用程序的智能合约构造函数,我们需要一些外部资源来与我们的应用程序集成。在本文中,我们以 Chainlink 作为资源样本。以下是我们需要的 5 个组件:

  • 喂价地址
  • VRF 协调员
  • 链接令牌
  • 密钥哈希
  • 费用

我们需要去Chainlink GitHub复制最新版本并单独粘贴到我们的contracts文件夹中。样本如下:

喂价地址、链接代币密钥、密钥哈希和费用请前往Chainlink官网查找相关信息。

其余关键组件 – 配置 YAML 和 env

其余关键组件是 Brownie 配置 YAML 文件和 env 文件。欲了解更多详情,请查看之前有关fund-me智能合约的文章。基本上和我们现在说的抽奖应用的设置是一样的

使用 Python 和 Web3 在以太坊上部署 Brownie FundMe 智能合约

单元测试

正如之前的文章中提到的,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 在以太坊上部署的文章。

Web3 DApp 全面的完整 Python 和 Solidity 脚本 – 彩票应用

如果您对Web3 DApp彩票全套脚本感兴趣,请添加消息“Web3.0教程5”来订阅我们的新闻通讯。我们会立即将脚本发送到您的邮箱。

我希望您喜欢阅读使用 Python 和 Brownie 进行 Web3 DApp 全面开发 – 彩票。如果您这样做了,请通过执行下列操作之一来支持我们,因为这总是对我们的频道有所帮助。