ZORA 是一个备受关注的去层化应用(dApp)平台和 NFT 市场,它以其创新的低费用、高速度的以太坊 Layer 2 解决方案和强大的开发者工具而闻名,如果你是一名开发者,并希望基于 ZORA 平台进行开发、测试或部署自己的 dApp,那么搭建一个本地开发环境是必不可少的步骤,本文将详细介绍如何从零开始搭建 ZORA 币(更准确地说是 ZORA 协议及其代币 ZORA)的本地开发环境。
理解 ZORA 开发环境
在开始之前,我们需要明确一点:ZORA 本身不是一个像比特币那样的“币”,而是一个构建在以太坊(特别是其 Layer 2 网络 OP Stack,如 Base)之上的协议,其原生代币 ZORA 用于协议内的激励、治理等功能,搭建 ZORA 的本地开发环境,更多的是指搭建一个能够与 ZORA 协议交互、部署和测试 ZORA 相关智能合约以及开发前端 dApp 的本地环境。
这通常包括以下几个核心组件:
- 以太坊节点/客户端:用于与区块链网络交互。
- 开发框架:如 Hardhat 或 Foundry,用于编写、编译、测试和部署智能合约。
- 前端框架:如 Next.js 或 React,用于构建用户界面。
- ZORA SDK/合约:ZORA 提供的官方开发工具包和核心合约。
- 钱包集成:如 MetaMask,用于用户与 dApp 交互。
前提条件
在开始搭建之前,请确保你的开发环境满足以下条件:
- 操作系统:macOS、Linux 或 Windows (推荐使用 WSL2 - Windows Subsystem for Linux)。
- Node.js:建议版本为 18.x 或更高,可以通过 Node.js 官网 下载并安装。
- npm 或 yarn:Node.js 的包管理器,npm 通常随 Node.js 一起安装,yarn 可以通过
npm install -g yarn安装。 - Git:用于版本控制,可以从 Git 官网 下载安装。
- 代码编辑器:推荐使用 VS Code,并安装 Solidity 插件(如 Hardhat for VS Code)。
- MetaMask 测试钱包:从 MetaMask 官网 安装浏览器扩展,并创建一个或多个测试账户。
搭建步骤
步骤 1:安装并配置本地开发节点
ZORA 协议主要部署在以太坊的 Layer 2 网络上,Base,对于本地开发,我们通常使用 Hardhat 提供的本地节点(Hardhat Network),它模拟了以太坊行为,非常适合快速开发和测试。
-
创建项目目录:
mkdir zora-dapp-dev cd zora-dapp-dev
-
初始化 npm 项目:
npm init -y
-
安装 Hardhat:
npm install --save-dev hardhat
-
初始化 Hardhat 项目:
npx hardhat
在交互式命令中,选择 "Create a basic sample project"(创建一个基本示例项目),然后一路回车使用默认配置,这会生成
hardhat.config.js文件和一些示例合约和测试脚本。
步骤 2:安装 ZORA 相关依赖
ZORA 提供了官方的合约库和 SDK,方便开发者快速集成。
-
安装 ZORA 合约:
npm install @zoralabs/zora-protocol
这会安装 ZORA 协议的核心合约,包括 NFT 合约、市场合约等。
-
安装 OpenZeppelin 合约(可选但推荐): OpenZeppelin 提供了经过审计的、安全的 Solidity 合约模板。
npm install @openzeppelin/contracts
-
安装 Ethers.js(用于与区块链交互):
npm install ethers
步骤 3:配置 Hardhat
我们需要在 hardhat.config.js 文件中配置网络信息,以便连接到本地 Hardhat 节点或测试网。
打开 hardhat.config.js,你可以根据需要添加配置,确保默认的 Hardhat 网络是启用的:
require("@nomicfoundation/hardhat-toolbox");
require("@openzeppelin/contracts");
/** @type import('hardhat/config').HardhatUserConfig */
module.exports = {
solidity: "0.8.19", // 根据你的需求调整 Solidity 版本
networks: {
hardhat: {
// 默认配置通常足够
},
// 如果你想要连接到测试网,可以在这里添加配置
// base-goerli (Base 测试网)
// baseGoerli: {
// url: "https://goerli.base.org",
// accounts: [process.env.PRIVATE_KEY] // 使用环境变量存储私钥
// }
},
etherscan: {
apiKey: process.env.ETHERSCAN_API_KEY // 如果你需要验证合约到测试网
}
};
步骤 4:编写和测试智能合约
-
创建新的合约文件: 在
contr目录下,创建一个新的 Solidity 文件,acts
MyZoraNFT.sol。 -
编写合约: 你可以基于 ZORA 的 NFT 合约进行扩展,或者编写一个简单的合约来与 ZORA 协议交互。
// contracts/MyZoraNFT.sol // SPDX-License-Identifier: MIT pragma solidity ^0.8.19; import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; // 如果你需要使用 ZORA 的特定功能,可以导入相应的 ZORA 合约 // import "@zoralabs/zora-protocol/contracts/token/ERC721/extensions/ERC721CreatorRoyalties.sol"; contract MyZoraNFT is ERC721, Ownable { uint256 private _tokenIdCounter; constructor() ERC721("MyZoraNFT", "MZORA") { _tokenIdCounter = 1; } function mint(address to, uint256 tokenId) public onlyOwner { _safeMint(to, tokenId); } function safeMint(address to) public onlyOwner { uint256 tokenId = _tokenIdCounter; _safeMint(to, tokenId); _tokenIdCounter++; } } -
编写测试脚本: 在
test目录下,为你的合约编写测试脚本。MyZoraNFT.test.js:// test/MyZoraNFT.test.js const { expect } = require("chai"); const { ethers } = require("hardhat"); describe("MyZoraNFT", function () { it("Should mint and return the correct token URI", async function () { const MyZoraNFT = await ethers.getContractFactory("MyZoraNFT"); const myZoraNFT = await MyZoraNFT.deploy(); await myZoraNFT.deployed(); const [owner, addr1] = await ethers.getSigners(); await myZoraNFT.safeMint(addr1.address); expect(await myZoraNFT.ownerOf(1)).to.equal(addr1.address); }); }); -
运行测试: 在终端中执行:
npx hardhat test
步骤 5:部署合约到本地网络
-
创建部署脚本: 在
scripts目录下,创建一个部署脚本,deploy.js:// scripts/deploy.js async function main() { const MyZoraNFT = await ethers.getContractFactory("MyZoraNFT"); const myZoraNFT = await MyZoraNFT.deploy(); await myZoraNFT.deployed(); console.log("MyZoraNFT deployed to:", myZoraNFT.address); } main() .then(() => process.exit(0)) .catch((error) => { console.error(error); process.exit(1); }); -
执行部署:
npx hardhat run scripts/deploy.js --network hardhat
这会将你的合约部署到本地 Hardhat 节点,并输出合约地址。
步骤 6:搭建前端 dApp(可选)
如果你想开发一个