BSC DeFi DApp开发实战:环境配置与基础知识

日期: 栏目:答疑 浏览:89

BSC DeFi 开发实战:从零开始构建你的第一个 DApp

准备工作:环境配置与基础知识

在踏入币安智能链 (BSC) 上的去中心化应用 (DApp) 开发之旅前,务必先搭建一个坚实可靠的基础。 这包括配置完善的开发环境,熟悉必要的开发工具,以及深入理解一些关键的基础知识,例如Solidity编程,区块链原理,智能合约安全等。

请确认你的系统已经成功安装以下软件:

  • Node.js 和 npm (或 yarn): Node.js 是基于 Chrome V8 引擎的 JavaScript 运行环境,使 JavaScript 能够脱离浏览器运行于服务器端。 npm (Node Package Manager) 和 yarn 都是流行的包管理器,它们极大地简化了项目依赖的管理,用于安装、更新和删除项目所需的各种库和工具。建议安装最新稳定版本的Node.js,以便获得更好的性能和安全性。
  • Git: 这是一个分布式版本控制系统,用于高效地跟踪代码的变更历史,方便代码管理和团队协作。 通过Git,开发者可以轻松地回溯到之前的代码版本,进行分支开发,以及合并不同开发者的代码修改。强烈建议学习Git的基本命令,例如clone, add, commit, push, pull等。
  • MetaMask: 这是一个流行的浏览器插件钱包,它可以安全地存储用户的以太坊和BSC地址,并允许用户与 BSC 网络上的 DApp 进行交互。 MetaMask 允许用户管理自己的私钥,并签署交易,从而实现与区块链的无缝连接。请务必妥善保管你的MetaMask私钥和助记词,避免泄露。
  • Truffle 或 Hardhat: 这两个都是专门为以太坊开发的开发框架,它们提供了一系列的工具和库,帮助开发者更高效地构建、测试和部署智能合约。 推荐使用 Hardhat,因为它在性能、可扩展性和插件生态系统方面通常更具优势。 Hardhat提供了更好的调试体验,更快的编译速度,以及更丰富的插件, 例如gas reporter, coverage等。

安装完这些必备工具之后,让我们开始创建你的第一个 Hardhat 项目:

bash mkdir my-first-bsc-dapp cd my-first-bsc-dapp npm init -y # 或者 yarn init -y npm install --save-dev hardhat @nomicfoundation/hardhat-toolbox npx hardhat

在命令行中运行 npx hardhat 命令时,Hardhat 会提示你选择一个配置类型。 为了快速上手,建议选择 "Create a basic sample project"。 这将自动创建一个包含基本智能合约、部署脚本和测试用例的 Hardhat 项目结构,为你提供一个良好的起点。

接下来,你需要配置 Hardhat,使其能够连接到 BSC 网络。 这需要指定BSC节点的RPC URL和Chain ID。 打开 hardhat.config.js 文件,并添加或修改以下配置信息:

javascript require("@nomicfoundation/hardhat-toolbox"); /** @type import('hardhat/config').HardhatUserConfig */ module.exports = { solidity: "0.8.9", // 指定Solidity编译器版本。选择一个与你的智能合约兼容的版本。 networks: { bscTestnet: { url: "https://data-seed-prebsc-1-s1.binance.org:8545", // BSC 测试网的 RPC URL。用于连接到BSC测试网络。 chainId: 97, // BSC 测试网的 Chain ID。确保chainId与网络匹配。 gasPrice: 20000000000, // Gas Price,用于设置交易的gas费用,根据当前网络状况进行调整。 accounts: [process.env.PRIVATE_KEY || "你的私钥"], // 从环境变量或配置文件中读取私钥。 绝对不要将私钥硬编码到代码中! 使用环境变量或配置文件来安全地管理你的私钥。 }, bscMainnet: { url: "https://bsc-dataseed.binance.org/", // BSC 主网的 RPC URL。用于连接到BSC主网络。 chainId: 56, // BSC 主网的 Chain ID。 gasPrice: 5000000000, // Gas Price,根据网络状况调整。 accounts: [process.env.PRIVATE_KEY || "你的私钥"], // 从环境变量或配置文件中读取私钥。 }, }, };

注意: 永远不要将你的私钥直接硬编码到代码中。使用环境变量或安全的配置文件来存储你的私钥。可以使用 dotenv 包来管理环境变量。

编写智能合约:一个简单的 ERC-20 Token 合约

现在,我们将创建一个简单的 ERC-20 Token 合约,名为 MyToken.sol 。ERC-20 是以太坊区块链上用于创建代币的标准接口,它定义了一组必须实现的方法和事件,以确保代币可以与其他去中心化应用(DApps)和钱包兼容。遵循 ERC-20 标准的代币可以轻松地在交易所上市和交易。 在 contracts 目录下创建一个名为 MyToken.sol 的文件,并将以下代码添加到其中:

这段 Solidity 代码定义了一个名为 MyToken 的智能合约,它继承了 OpenZeppelin 提供的 ERC-20 实现。OpenZeppelin Contracts 是一个经过安全审计的智能合约库,其中包含了各种常用的合约标准,如 ERC-20、ERC-721 (NFT) 等,可以大大简化智能合约的开发过程,并提高合约的安全性。

solidity


// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";

contract MyToken is ERC20 {
    constructor(string memory name, string memory symbol, uint256 initialSupply) ERC20(name, symbol) {
        _mint(msg.sender, initialSupply);
    }
}

该合约首先通过 pragma solidity ^0.8.0; 指定了 Solidity 编译器的版本。 ^0.8.0 表示可以使用 0.8.0 及以上版本,但不高于 0.9.0 的编译器版本。 import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; 语句导入了 OpenZeppelin 库中的 ERC-20 合约,以便 MyToken 合约可以继承其功能。

contract MyToken is ERC20 { ... } 定义了名为 MyToken 的合约,并声明它继承自 ERC20 合约。构造函数 constructor(string memory name, string memory symbol, uint256 initialSupply) ERC20(name, symbol) { ... } 在合约部署时执行,它接受三个参数:代币的名称 ( name )、代币的符号 ( symbol ) 和初始供应量 ( initialSupply )。 ERC20(name, symbol) 调用父合约(即 OpenZeppelin 的 ERC-20 合约)的构造函数,设置代币的名称和符号。 _mint(msg.sender, initialSupply); 函数(由 OpenZeppelin ERC-20 提供)将初始供应量的代币铸造给合约的部署者 ( msg.sender ), msg.sender 是一个全局变量,表示发起交易的地址。

这个合约继承了 OpenZeppelin 的 ERC-20 实现,极大地简化了代币合约的开发。构造函数用于初始化代币的名称、符号,并将初始供应量分配给部署合约的账户。 OpenZeppelin 合约已经经过广泛的测试和审计,可以有效降低安全漏洞的风险。

接下来,你需要安装 OpenZeppelin contracts 依赖。OpenZeppelin Contracts 是一个 npm 包,包含了 ERC-20、ERC-721 等常用智能合约的实现。 使用 npm (Node Package Manager)来安装:

bash


npm install @openzeppelin/contracts

这条命令会将 OpenZeppelin Contracts 库安装到你的项目目录下的 node_modules 文件夹中。安装完成后,你就可以在你的 Solidity 代码中导入 OpenZeppelin 的合约,就像我们在 MyToken.sol 中做的那样。 确保你的项目中已经初始化了 package. 文件,如果没有,可以使用 npm init -y 命令创建一个。

部署智能合约:连接到 BSC 网络

合约编写完成后,下一步是将其部署到 Binance Smart Chain (BSC) 网络。为了实现这一目标,我们需要配置并执行部署脚本。打开 scripts 目录下的 deploy.js 文件,并按照以下说明进行修改,以适应你的智能合约。

deploy.js 文件的主要作用是利用 Hardhat 提供的工具和函数,将编译好的智能合约部署到指定的区块链网络。以下是示例代码:

javascript const hre = require("hardhat"); async function main() { // 获取合约工厂,"MyToken" 需要替换为你实际的合约名称 const MyToken = await hre.ethers.getContractFactory("MyToken"); // 部署合约,构造函数参数根据你的合约实际情况修改 const myToken = await MyToken.deploy("MyToken", "MTK", 1000000); // 等待合约完成部署 await myToken.deployed(); // 在控制台输出合约的部署地址 console.log("MyToken deployed to:", myToken.address); } main() .then(() => process.exit(0)) .catch((error) => { console.error(error); process.exit(1); });

这段脚本使用 Hardhat 部署 MyToken 合约。 hre.ethers.getContractFactory("MyToken") 用于获取合约的抽象工厂,允许我们创建合约实例。 myToken.deploy("MyToken", "MTK", 1000000) 用于部署合约,其中 "MyToken", "MTK", 和 1000000 是传递给合约构造函数的参数。这些参数需要根据你的合约的实际情况进行调整。 myToken.deployed() 确保合约被成功部署到链上。最终,合约的地址会被打印到控制台上。

为了成功运行部署脚本,必须正确设置 PRIVATE_KEY 环境变量。此私钥用于签署部署交易,授权对部署账户的资金使用。确保私钥的安全,不要泄露给他人。推荐使用环境变量而不是直接将私钥硬编码在脚本中。

bash export PRIVATE_KEY="你的私钥" npx hardhat run scripts/deploy.js --network bscTestnet # 或 bscMainnet

将 "你的私钥" 替换为你从 MetaMask 或其他钱包应用程序中导出的账户私钥。注意,私钥必须与你在 Hardhat 配置文件中指定的账户相对应。 --network bscTestnet --network bscMainnet 参数指定了部署的目标网络。 bscTestnet 是 BSC 测试网络,用于测试目的; bscMainnet 是 BSC 主网络,用于真实交易。请根据实际需求选择合适的网络。在测试网络上部署合约通常需要使用水龙头 (Faucet) 获取测试 BNB 作为 gas 费。

执行部署命令后,如果一切顺利,你将在控制台中看到类似如下的输出,其中包含已部署合约的地址:

MyToken deployed to: 0xYourContractAddress...

这个地址非常重要,因为它将用于与你的智能合约进行交互,包括调用合约函数、查询合约状态等。请妥善保存此地址。

与智能合约交互:使用 JavaScript

现在,让我们深入了解如何编写一个 JavaScript 脚本,利用 Hardhat 环境与已经部署的 MyToken 合约进行交互。为了组织代码,我们将在 scripts 目录下创建一个名为 interact.js 的文件,并将以下代码复制到其中。这个脚本将演示如何查询 Token 余额以及如何发起 Token 转账。

javascript const hre = require("hardhat");

async function main() { const tokenAddress = "你的合约地址"; // 替换为你的合约地址 const [signer] = await hre.ethers.getSigners();

const MyToken = await hre.ethers.getContractFactory("MyToken"); const myToken = MyToken.attach(tokenAddress);

const balance = await myToken.balanceOf(signer.address); console.log("你的余额:", balance.toString());

const recipient = "接收者地址"; // 替换为接收者地址 const amount = hre.ethers.utils.parseUnits("100", 18); // 发送 100 个 Token

const tx = await myToken.transfer(recipient, amount); await tx.wait();

console.log("交易已发送:", tx.hash);

const newBalance = await myToken.balanceOf(signer.address); console.log("你的新余额:", newBalance.toString()); }

main() .then(() => process.exit(0)) .catch((error) => { console.error(error); process.exit(1); });

务必将代码中的 "你的合约地址" 替换为你实际部署的 MyToken 合约地址。同样,需要将 "接收者地址" 替换为你希望发送 Token 的目标地址。 hre.ethers.utils.parseUnits("100", 18) 这行代码将字符串 "100" 转换为一个 BigNumber 对象,并乘以 10 18 ,这是因为 MyToken 合约使用了 18 位小数精度。这样做确保了数量的正确表示和传递。

现在,让我们详细解释如何运行这个脚本。需要设置环境变量 PRIVATE_KEY ,该变量存储你的私钥,用于签署交易。确保私钥的安全性,不要泄露给任何人。使用以下命令来运行脚本:

bash export PRIVATE_KEY="你的私钥" npx hardhat run scripts/interact.js --network bscTestnet # 或 bscMainnet

在这里, PRIVATE_KEY 环境变量用于提供签署交易所需的私钥。 npx hardhat run scripts/interact.js 命令告诉 Hardhat 运行 scripts 目录下的 interact.js 文件。 --network bscTestnet 参数指定了要连接的网络,这里使用的是币安智能链测试网。如果你要连接到币安智能链主网,可以将 bscTestnet 替换为 bscMainnet 。请注意,在主网上进行操作时,需要谨慎,并确保拥有足够的 BNB 用于支付交易 Gas 费用。

这个脚本首先会查询你账户中的 Token 余额,然后向指定的接收者地址发送 100 个 Token。交易成功后,它会打印出交易哈希(tx.hash),你可以使用这个哈希在区块链浏览器上查询交易详情。脚本会再次查询你的 Token 余额,并打印出更新后的余额。

构建前端界面:连接 MetaMask

为了构建一个完整的 DApp,我们需要一个前端界面,允许用户与我们的智能合约进行交互。 你可以使用 React, Vue, Angular 等任何你熟悉的前端框架。 这里我们使用一个简单的 HTML 文件作为示例:

MyToken DApp BSC DeFi DApp开发实战:环境配置与基础知识_币科普

MyToken DApp

Account:

Balance:

将 "你的合约地址" 替换为你部署的合约地址,并将 tokenABI 替换为你的合约的 ABI。 你可以使用 Hardhat 编译合约后生成的 JSON 文件中找到合约的 ABI。

打开这个 HTML 文件,点击 "Connect Wallet" 按钮连接 MetaMask,然后点击 "Get Balance" 按钮获取你的 Token 余额。

恭喜你,你已经成功构建了你的第一个 BSC DApp!