使用 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、Openzeppelink 开发智能合约
- 彩票应用中的主要部署和辅助Python脚本
- 添加 Mock、VRF 和 Link Token 测试合约
- 其余关键组件 – 配置 YAML 和 env
- 单元测试
- 连接真实网络并使其上线
- Web3 DApp全面的Python和Solidity脚本-彩票应用案例
使用 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智能合约的文章。基本上和我们现在说的抽奖应用的设置是一样的
单元测试
正如之前的文章中提到的,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 全面开发 – 彩票。如果您这样做了,请通过执行下列操作之一来支持我们,因为这总是对我们的频道有所帮助。
- 通过 PayPal ( paypal.me/Easy2digital ) 支持并捐赠我的频道
- 订阅我的频道并打开通知铃Easy2Digital Youtube 频道。
- 关注并喜欢我的页面Easy2Digital Facebook 页面
- 使用主题标签 #easy2digital 在您的社交网络上分享文章
- 您订阅我们的每周通讯即可接收 Easy2Digital 最新文章、视频和折扣代码
- 通过 Patreon 订阅我们的月度会员即可享受独家优惠 ( www.patreon.com/louisludigital )