# 使用Brownie部署合约 **Published by:** [Yooma](https://paragraph.com/@yooma/) **Published on:** 2022-12-26 **URL:** https://paragraph.com/@yooma/brownie ## Content 关于Brownie的安装测试在这里已经讲到,本篇着重讲如何部署合约。一:首先在infura创建一个项目二:(如果读过本篇文章的话可以忽略下面这个步骤) 初始化brownie项目编译合约代码执行 brownie init编写合约代码// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; import "@openzeppelin/contracts/utils/Counters.sol"; import "../interfaces/IERC4907.sol"; contract ERC4907 is ERC721, IERC4907 { struct UserInfo { address user; // address of user role uint64 expires; // unix timestamp, user expires } mapping (uint256 => UserInfo) private _users; constructor() ERC721("RentNFTTest","RNT"){ } /// @notice set the user and expires of a NFT /// @dev The zero address indicates there is no user /// Throws if `tokenId` is not valid NFT /// @param user The new user of the NFT /// @param expires UNIX timestamp, The new user could use the NFT before expires function setUser(uint256 tokenId, address user, uint64 expires) public override virtual{ // 判断msg.sender是否是该token的owner require(_isApprovedOrOwner(msg.sender, tokenId), "ERC4907: transfer caller is not owner nor approved"); // 设置 租赁者以及到期时间 UserInfo storage info = _users[tokenId]; info.user = user; info.expires = expires; // 更新该token的User emit UpdateUser(tokenId,user,expires); } /// @notice Get the user address of an NFT /// @dev The zero address indicates that there is no user or the user is expired /// @param tokenId The NFT to get the user address for /// @return The user address for this NFT function userOf(uint256 tokenId) public view override virtual returns(address){ if( uint256(_users[tokenId].expires) >= block.timestamp){ return _users[tokenId].user; } return address(0); } /// @notice Get the user expires of an NFT /// @dev The zero value indicates that there is no user /// @param tokenId The NFT to get the user expires for /// @return The user expires for this NFT function userExpires(uint256 tokenId) public view override virtual returns(uint256){ return _users[tokenId].expires; } /// @dev See {IERC165-supportsInterface}. function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721) returns (bool) { return interfaceId == type(IERC4907).interfaceId || super.supportsInterface(interfaceId); } function mint(tokenId) public returns (uint256){ _safeMint(msg.sender, tokenId); return tokenId; } } 代码在这篇文章功能测试已经提到,这里直接搬过来用配置 brownie-config.yaml执行 brownie compile来编译生成abi文件等在之前的基础上配置brownie-config.yamldotenv: .env networks: # 指定使用 goerli测试网 WEB3_INFURA_PROJECT_ID是上方infura截图中框出的api_key goerli: host: https://goerli.infura.io/v3/${WEB3_INFURA_PROJECT_ID} wallets: PRIVATE_KEY: ${PRIVATE_KEY} # 钱包地址的私钥,因为比较重要通过导入.env 在项目目录中创建一个.env在.env中写上私钥和infrua的project_id(api_key)在 scripts/ 中创建一个脚本 depoly.py from brownie import ERC4907, accounts, config import brownie def get_account(): # 要部署到测试网络不在本地,添加账户对象 # config数据来自brownie-config.yaml return accounts.add(config['wallets']['PRIVATE_KEY']) def test_mint(account): mint_nft = ERC4907.deploy({'from', account}) mint_nft.mint(1, {'from': account}) # 查看mint nft 之后的owner print('nft token_id owner/minter:', mint_nft.ownerOf(1)) # 一定要有main()函数作为程序的入口 def main(): account = get_account() print('account=', account) test_mint(account) 此时执行brownie run scripts/depoly.pymint之后可以看到nft的owner是我的账户 查看以下brownie自带的部署的网络,这里使用goerli,如果没有要用到的网络可以自己添加,具体操作可以查看brownie文档部署 获取测试币 部署的话需要交gas费,这样需要到goerli的水龙头获取一些测试币 把metamask网络设置成goerli测试网这个地址包含多种获取测试币的方式 https://faucetlink.to/goerli 这个地址是我看到的给的比较多的 https://faucets.chain.link/ 然后将此合约部署到以太坊goerli测试网 brownie run scripts/depoly.py --network goerli拿着合约地址到以太坊测试网查看下第二行记录是创建这个合约的记录 第一行mint记录是depoly.py中mint nft的记录 这样就代表合约部署成功。 ## Publication Information - [Yooma](https://paragraph.com/@yooma/): Publication homepage - [All Posts](https://paragraph.com/@yooma/): More posts from this publication - [RSS Feed](https://api.paragraph.com/blogs/rss/@yooma): Subscribe to updates - [Twitter](https://twitter.com/_yoonama): Follow on Twitter