从零开始,0x合约如何部署与测试到测试网

在区块链应用开发中,尤其是涉及到去中心化交易(DEX)等复杂场景时,0x协议(0x Protocol)作为一个开源的、去中心化的点对点交易协议框架,扮演着重要角色,在将0x合约部署到主网之前,充分的测试是必不可少的,而测试网(如Ropsten, Kovan, Goerli, Sepolia等)为我们提供了一个无需真实资金、安全高效的测试环境,本文将详细介绍如何将0x合约部署并测试到以太坊测试网。

前期准备

在开始之前,请确保你已经具备以下条件和工具:

  1. Node.js 和 npm/yarn: 确保你的系统已安装Node.js(建议LTS版本)和npm或yarn包管理器。

  2. Truffle 或 Hardhat: 这是以太坊最流行的开发框架,用于编译、部署和测试智能合约,本文将以Truffle为例进行讲解,Hardhat的流程类似。

  3. MetaMask: 一个常用的浏览器钱包插件,用于与测试网交互,管理测试网ETH。

  4. 测试网ETH: 你需要从测试网水龙头(Faucet)获取免费的测试网ETH,用于支付部署合约时的Gas费用,Goerli测试网的水龙头地址可以在以太坊官方文档或社区论坛找到。

  5. 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安装。

  6. 代码编辑器: 如VS Code,配合Solidity插件。

配置Truffle环境

  1. 初始化Truffle项目(如果还没有): 如果你的项目是独立的,可以运行:

    truffle init

    如果是从0x monorepo开始,通常已经包含了Truffle配置文件。

  2. 配置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: 根据测试网的拥堵情况调整。
  3. 创建环境变量文件: 为了安全,建议使用.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合约

  1. 确定要部署的合约: 0x协议包含多个核心合约,如Exchange.sol, TokenTransferProxy.sol, ERC20Proxy.sol等,你需要根据你的应用需求确定部署哪些合约,0x的示例项目会提供migrations脚本。

  2. 运行编译命令: 在项目根目录运行:

    truffle compile

    Truffle会自动查找contracts目录下的Solidity文件并进行编译,编译成功后,会在build/contracts目录下生成ABI和字节码文件。

部署合约到测试网

  1. 编写迁移脚本 (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提供的测试网账户列表,第一个账户通常是助记词对应的账户。
  2. 配置MetaMask:

    • 打开MetaMask,点击网络下拉菜单。
    • 选择“添加网络”。
    • 如果是Goerli,可以选择“显示/隐藏测试网络”然后找到Goerli,或者手动添加:
      • 网络名称: Goerli Testnet
      • RPC URL: https://goerli.infura.io/v3/YOUR_INFURA_PROJECT_ID
      • 链ID: 5
      • 货币符号: Goerli ETH
    • 确保MetaMask切换到刚刚添加的测试网络(如Goerli)。
  3. 获取测试网ETH: 访问Goerli测试网水龙头(如https://goerlifaucet.com/),将你的MetaMask账户地址粘贴进去获取测试ETH,获取后,MetaMask账户余额会更新。

  4. 运行部署命令: 确保MetaMask已解锁,并且当前账户有足够的测试ETH,然后运行:

    truffle migrate --network goerli
    • --network goerli: 指定部署到goerli测试网。
    • Truffle会依次执行migrations目录下的脚本,按照编号顺序部署合约。

    部署过程中,MetaMask可能会弹出交易确认窗口,点击“确认”即可,等待交易被打包确认后,合约就成功部署到测试网了。

验证部署结果

  1. 查看交易详情: 在Etherscan(测试网版本,如https://goerli.etherscan.io/)中,你可以查看到部署合约的交易详情,包括合约地址、ABI

本文由用户投稿上传,若侵权请提供版权资料并联系删除!