在区块链应用开发中,尤其是涉及到去中心化交易(DEX)等复杂场景时,0x协议(0x Protocol)作为一个开源的、去中心化的点对点交易协议框架,扮演着重要角色,在将0x合约部署到主网之前,充分的测试是必不可少的,而测试网(如Ropsten, Kovan, Goerli, Sepolia等)为我们提供了一个无需真实资金、安全高效的测试环境,本文将详细介绍如何将0x合约部署并测试到以太坊测试网。
前期准备
在开始之前,请确保你已经具备以下条件和工具:
-
Node.js 和 npm/yarn: 确保你的系统已安装Node.js(建议LTS版本)和npm或yarn包管理器。
-
Truffle 或 Hardhat: 这是以太坊最流行的开发框架,用于编译、部署和测试智能合约,本文将以Truffle为例进行讲解,Hardhat的流程类似。
-
MetaMask: 一个常用的浏览器钱包插件,用于与测试网交互,管理测试网ETH。
-
测试网ETH: 你需要从测试网水龙头(Faucet)获取免费的测试网ETH,用于支付部署合约时的Gas费用,Goerli测试网的水龙头地址可以在以太坊官方文档或社区论坛找到。
-
0x合约源码<
/strong>: 你可以通过
npm安装0x的monorepo,或者从GitHub克隆0x协议的官方仓库。# 克隆0x协议仓库(推荐,包含完整示例和合约) git clone https://github.com/0xProject/0x-monorepo.git cd 0x-monorepo # 安装依赖 yarn install
或者,如果你只需要特定合约,可以通过
npm install @0x/contracts安装。 -
代码编辑器: 如VS Code,配合Solidity插件。
配置Truffle环境
-
初始化Truffle项目(如果还没有): 如果你的项目是独立的,可以运行:
truffle init
如果是从0x monorepo开始,通常已经包含了Truffle配置文件。
-
配置Truffle.js (或truffle-config.js): 打开
truffle-config.js文件,配置测试网网络信息,配置Goerli测试网(以太坊的官方测试网之一):module.exports = { networks: { development: { host: "127.0.0.1", port: 7545, network_id: "*", // Match any network id }, goerli: { provider: () => new HDWalletProvider(mnemonic, `https://goerli.infura.io/v3/YOUR_INFURA_PROJECT_ID`), network_id: 5, // Goerli's id gas: 5500000, // Gas limit gasPrice: 20000000000, // 20 Gwei confirmations: 2, // # of confs to wait between deployments timeoutBlocks: 200, // # of blocks before a deployment times out skipDryRun: true // Skip dry run before migrations }, // 可以添加其他测试网,如ropsten, kovan, sepolia等 }, compilers: { solc: { version: "0.8.17", // 使用与0x合约兼容的Solidity版本 } } };mnemonic: 你的MetaMask钱包的助记词,注意:不要将助记词直接硬编码在代码中,建议使用环境变量管理。YOUR_INFURA_PROJECT_ID: 替换为你在Infura创建的项目ID(Infura提供免费的节点服务)。network_id: 对应测试网的ID,Goerli是5。gasPrice: 根据测试网的拥堵情况调整。
-
创建环境变量文件: 为了安全,建议使用
.env文件来存储敏感信息如助记词和Infura ID。 安装dotenv:npm install dotenv --save-dev
在项目根目录创建
.env文件:MNEMONIC=你的钱包助记词 INFURA_PROJECT_ID=你的Infura项目ID然后在
truffle-config.js开头引入:require('dotenv').config(); const HDWalletProvider = require("@truffle/hdwallet-provider");
编译0x合约
-
确定要部署的合约: 0x协议包含多个核心合约,如
Exchange.sol,TokenTransferProxy.sol,ERC20Proxy.sol等,你需要根据你的应用需求确定部署哪些合约,0x的示例项目会提供migrations脚本。 -
运行编译命令: 在项目根目录运行:
truffle compile
Truffle会自动查找
contracts目录下的Solidity文件并进行编译,编译成功后,会在build/contracts目录下生成ABI和字节码文件。
部署合约到测试网
-
编写迁移脚本 (Migrations Scripts): 在
migrations目录下创建一个新的迁移脚本,例如2_deploy_contracts.js,这个脚本将告诉Truffle如何部署合约。 部署0x的核心代理合约和交换合约(具体取决于你的需求,可以参考0x官方示例):const TokenTransferProxy = artifacts.require("TokenTransferProxy"); const ERC20Proxy = artifacts.require("ERC20Proxy"); const Exchange = artifacts.require("Exchange"); module.exports = async function (deployer, network, accounts) { // 部署TokenTransferProxy await deployer.deploy(TokenTransferProxy); const tokenTransferProxyInstance = await TokenTransferProxy.deployed(); // 部署ERC20Proxy await deployer.deploy(ERC20Proxy, tokenTransferProxyInstance.address); const erc20ProxyInstance = await ERC20Proxy.deployed(); // 部署Exchange // 注意:Exchange合约的构造函数参数可能需要根据实际情况调整 // 需要传入ZRX代币地址(测试网上的ZRX地址是固定的)和feeRecipient等 const zrxTokenAddress = "0xAf5191B0De27a708789B534eB1306A4a7d8A73fB"; // Goerli测试网ZRX地址 const feeRecipientAddress = accounts[0]; // 使用部署者地址作为费用接收者 await deployer.deploy( Exchange, zrxTokenAddress, feeRecipientAddress, erc20ProxyInstance.address ); };artifacts.require: 用于引入需要部署的合约。deployer.deploy(): 部署合约。accounts: Truffle提供的测试网账户列表,第一个账户通常是助记词对应的账户。
-
配置MetaMask:
- 打开MetaMask,点击网络下拉菜单。
- 选择“添加网络”。
- 如果是Goerli,可以选择“显示/隐藏测试网络”然后找到Goerli,或者手动添加:
- 网络名称: Goerli Testnet
- RPC URL:
https://goerli.infura.io/v3/YOUR_INFURA_PROJECT_ID - 链ID: 5
- 货币符号: Goerli ETH
- 确保MetaMask切换到刚刚添加的测试网络(如Goerli)。
-
获取测试网ETH: 访问Goerli测试网水龙头(如
https://goerlifaucet.com/),将你的MetaMask账户地址粘贴进去获取测试ETH,获取后,MetaMask账户余额会更新。 -
运行部署命令: 确保MetaMask已解锁,并且当前账户有足够的测试ETH,然后运行:
truffle migrate --network goerli
--network goerli: 指定部署到goerli测试网。- Truffle会依次执行
migrations目录下的脚本,按照编号顺序部署合约。
部署过程中,MetaMask可能会弹出交易确认窗口,点击“确认”即可,等待交易被打包确认后,合约就成功部署到测试网了。
验证部署结果
- 查看交易详情:
在Etherscan(测试网版本,如
https://goerli.etherscan.io/)中,你可以查看到部署合约的交易详情,包括合约地址、ABI