开始使用
开始使用
Hardhat是一个Ethereum开发环境,为在Solidity中轻松开发智能合约而设计。它最突出的特点之一是可扩展性:你可以轻松地将新的插件添加到你的Hardhat项目中。
zkSync为Hardhat提供了以下插件。
- @matterlabs/hardhat-zksync-solc - 用于编译用Solidity编写的合约。
 - @matterlabs/hardhat-zksync-vyper - 用于编译用Vyper编写的合约。
 - @matterlabs/hardhat-zksync-deploy - 用来部署智能合约。
 - @matterlabs/hardhat-zksync-chai-matchers - 为测试智能合约的Chai断言库增加了zkSync的特定功能。
 - @matterlabs/hardhat-zksync-verify - 用来验证智能合约。
 
要了解更多关于Hardhat本身的信息,请查看[其官方文档](https://hardhat.org/getting-started/)。
本教程展示了如何使用Hardhat从头开始设置一个zkSync Solidity项目。 如果你使用 Vyper,请查看 GitHub 中的 Vyper 插件文档 或 这个例子
前提条件
对于本教程,必须安装以下程序。
yarn软件包管理器。npm例子将很快被添加。- 一个在L1上有足够的Göerli 
ETH的钱包,以支付桥接资金到zkSync以及部署智能合约。我们建议使用我们来自zkSync门户的龙头。 
项目设置
- 为了初始化项目并安装依赖性,在终端运行以下命令。
 
mkdir greeter-example
cd greeter-example
yarn init -y
yarn add -D typescript ts-node @types/node ethers@^5.7.2 zksync-web3@^0.13.1 @ethersproject/hash @ethersproject/web hardhat @matterlabs/hardhat-zksync-solc @matterlabs/hardhat-zksync-deploy
typescript、ts-node和@types/node的依赖是可选的--插件在vanilla JavaScript环境下可以正常工作。不过,请注意,本教程确实使用了TypeScript。
Tips
如果使用Yarn 2及以上版本,你可能需要做一些额外的步骤,以使TypeScript在你的编辑器中按预期工作。要了解更多,请查看Yarn的官方文档
Configuration
- 创建
hardhat.config.ts文件并在其中粘贴以下代码。 
import "@matterlabs/hardhat-zksync-deploy";
import "@matterlabs/hardhat-zksync-solc";
module.exports = {
  zksolc: {
    version: "1.3.1",
    compilerSource: "binary",
    settings: {},
  },
  defaultNetwork: "zkTestnet",
  networks: {
    zkTestnet: {
      url: "https://zksync2-testnet.zksync.dev", // URL of the zkSync network RPC
      ethNetwork: "goerli", // Can also be the RPC URL of the Ethereum network (e.g. `https://goerli.infura.io/v3/<API_KEY>`)
      zksync: true,
    },
  },
  solidity: {
    version: "0.8.17",
  },
};
Tips
要了解更多关于hardhat.config.ts文件中的每个具体属性,请查看插件文档./plugins.md)
Write and deploy a contract
- 创建合约和部署文件夹。在合约文件夹中,我们将存储所有的智能合约文件。在deploy文件夹中,我们将放置所有与部署合约有关的脚本。
 - 创建contracts/Greeter.sol合约并粘贴以下代码。
 
//SPDX-License-Identifier: Unlicensed
pragma solidity ^0.8.0;
contract Greeter {
    string private greeting;
    constructor(string memory _greeting) {
        greeting = _greeting;
    }
    function greet() public view returns (string memory) {
        return greeting;
    }
    function setGreeting(string memory _greeting) public {
        greeting = _greeting;
    }
}
- 运行
yarn hardhat compile,它使用hardhat-zksync-solc插件来编译合同。artifacts-zk和cache-zk文件夹将被创建在根目录下(而不是常规Hardhat的artifacts和cache)。 
Tips
注意artifacts-zk和cache-zk文件夹包含了编译工件和缓存,不应该被添加到版本控制中,所以把它们包含在你的项目的.gitignore文件中是个好的做法。
- 在
deploy/deploy.ts中创建部署脚本,代码如下。 
import { utils, Wallet } from "zksync-web3";
import * as ethers from "ethers";
import { HardhatRuntimeEnvironment } from "hardhat/types";
import { Deployer } from "@matterlabs/hardhat-zksync-deploy";
// An example of a deploy script that will deploy and call a simple contract.
export default async function (hre: HardhatRuntimeEnvironment) {
  console.log(`Running deploy script for the Greeter contract`);
  // Initialize the wallet.
  const wallet = new Wallet("<WALLET-PRIVATE-KEY>");
  // Create deployer object and load the artifact of the contract we want to deploy.
  const deployer = new Deployer(hre, wallet);
  const artifact = await deployer.loadArtifact("Greeter");
  // Deposit some funds to L2 in order to be able to perform L2 transactions.
  const depositAmount = ethers.utils.parseEther("0.001");
  const depositHandle = await deployer.zkWallet.deposit({
    to: deployer.zkWallet.address,
    token: utils.ETH_ADDRESS,
    amount: depositAmount,
  });
  // Wait until the deposit is processed on zkSync
  await depositHandle.wait();
  // Deploy this contract. The returned object will be of a `Contract` type, similarly to ones in `ethers`.
  // `greeting` is an argument for contract constructor.
  const greeting = "Hi there!";
  const greeterContract = await deployer.deploy(artifact, [greeting]);
  // Show the contract info.
  const contractAddress = greeterContract.address;
  console.log(`${artifact.contractName} was deployed to ${contractAddress}`);
  // Call the deployed contract.
  const greetingFromContract = await greeterContract.greet();
  if (greetingFromContract == greeting) {
    console.log(`Contract greets us with ${greeting}!`);
  } else {
    console.error(`Contract said something unexpected: ${greetingFromContract}`);
  }
  // Edit the greeting of the contract
  const newGreeting = "Hey guys";
  const setNewGreetingHandle = await greeterContract.setGreeting(newGreeting);
  await setNewGreetingHandle.wait();
  const newGreetingFromContract = await greeterContract.greet();
  if (newGreetingFromContract == newGreeting) {
    console.log(`Contract greets us with ${newGreeting}!`);
  } else {
    console.error(`Contract said something unexpected: ${newGreetingFromContract}`);
  }
}
将
WALLET-PRIVATE-KEY文本替换为你的Ethereum钱包的私钥后,使用以下命令运行该脚本。yarn hardhat deploy-zksync。这个脚本将从Goerli转移0.001个ETH到zkSync。
向zkSync Era Testnet部署带有 "你好!"信息的
Greeting合约。从合同中检索信息,调用
greet()方法。用
setGreeting()方法更新合同中的问候信息。再次从合约中获取消息。
恭喜你! 你的Hardhat项目现在已经在zkSync Era Testnet上运行了 🎉。
请求-速率超标消息
这条信息是由使用ethers提供的默认RPC端点引起的。为了避免这种情况,请使用你自己的Goerli RPC端点。你可以[在这里找到多个节点提供者](https://github.com/arddluma/awesome-list-rpc-nodes-providers)。
了解更多
- 要了解更多关于zkSync Hardhat插件的信息,请查看plugins documentation。
 - 如果你想了解更多关于如何使用Javascript与zkSync互动,请查看zksync-web3 Javascript SDK documentation 。
 
未来版本
未来将发布的插件有两个主要改进点。
- **与现有hardhat插件的兼容性。
 - **与其他hardhat插件的兼容性是未来的计划,但还没有成为重点。
 - 改进的跨平台支持。