Skip to content

Latest commit

 

History

History
424 lines (281 loc) · 13.5 KB

readme.md

File metadata and controls

424 lines (281 loc) · 13.5 KB
title tags
4. 开发工具
zksync
toolings
zksync-cli

WTF zkSync 极简入门: 4. 开发工具

这个系列教程帮助开发者入门 zkSync 开发。 推特:@0xAA_Science@WTFAcademy_

社区:Discord微信群官网 wtf.academy

所有代码和教程开源在 github: github.com/WTFAcademy/WTF-zkSync


这一讲,我们将介绍 zkSync 的生态和一些常用的工具。

1. zkSync 水龙头

Chainstack Faucet

水龙头

2. zkSync CLI

zkSync CLI 是一个用于简化 zkSync 开发与交互的命令行工具。它提供了诸如管理本地开发环境、与合约交互、管理代币等功能的命令。它包含以下命令及对应功能:

2.1 dev

用于管理本地开发环境

npx zksync-cli dev start

首次运行时需要选择 节点类型附加的模块(后续可通过 npx zksync-cli dev config 修改)。

  • 节点选择

    • In memory node:使用内存建立本地测试环境,只有 L2 节点,测试账户地址和私钥

    • Dockerized node:使用 Docker 建立本地测试环境,包含 L1 和 L2 节点。

节点选择

  • 附加模块选择

    • Portal:添加钱包和跨链桥相关功能。

    • Block Explorer:添加 zkSync 区块链浏览器 UI 和 API 相关功能。

附加模块

后续演示环境:In memory node不安装附加模块

2.2 config

用于配置自定义链,添加/编辑自定义链命令如下

npx zksync-cli config chains

根据提示即可完成添加/编辑自定义链操作

? Select a chain (选择添加/编辑已添加的自定义链)
? Chain id (自定义链 id )
? Chain name (自定义链名名称)
? Chain key (自定义链 key, 默认为自定义链)
? Chain RPC URL (自定义链的 RPC URL)
? Chain explorer URL [可选](自定义链浏览器地址)
? Is this chain connected to L1 (自定义链是否连接 L1 )

2.3 contract

用于操作链上合约(读、写等),使用 npx zksync-cli contract read 命令,我们可以非常方便地读取链上信息,如获取某个地址的 Token 余额:

npx zksync-cli contract read

根据提示选择合约所在的链(为了方便测试,这里我们选择 zkSync Sepolia Testne

? Chain to use (Use arrow keys)
> zkSync Sepolia Testnet
  zkSync Mainnet
  zkSync Goerli Testnet
  In-memory local node
  Dockerized local node

选择链之后,会要求输入合约地址(这里我们输入一个 ERC20 合约的地址做测试)

0x45E6dC995113fd3d1A3b1964493105B9AA9a9A42

zksync-cli 会自动为我们获取该地址对应合约的可读函数的函数签名(这里我们选择余额查询 balanceOf(address account) view returns (uint2)

? Contract method to call (Use arrow keys)
  ──────────────── Provided contract ────────────────
> allowance(address owner, address spender) view returns (uint256)
  balanceOf(address account) view returns (uint256)
  decimals() view returns (uint8)
  name() view returns (string)
  symbol() view returns (string)
  totalSupply() view returns (uint256)
  ───────────────────────────────────────────────────
  Type method manually

根据提示输入参数(根据函数签名可知,我们需要传入想要查询余额的地址)

0xa1cf087DB965Ab02Fb3CFaCe1f5c63935815f044

回车后我们就可以看到查询结果

√ Method response (raw): 0x00000000000000000000000000000000000000000000d3c20dee1639f99c0000
✔ Decoded method response: 999999000000000000000000

至此,我们就使用 zksync-cli 对合约进行读取的操作,是不是非常的方便?当然,zksycn-cli 的强大还远不止于此。

2.4 transaction

用于查询链上交易信息(交易状态、转账金额、gas 费用等)。我们可以使用交易哈希非常便捷地查询到对应的链上交易信息:

npx zksync-cli transaction info [options]

options:

  • --full:查询详细信息

  • --raw:显示原始 JSON 响应

接下来,我们使用 zksync-cli 查询 zkSync Sepolia Testnet 上交易哈希为 0xb427c3abd0397caeaea64a18dbf2ad7b699c5da49fa54dd31d3267f63341d8ea 的详细交易信息

npx zksync-cli transaction info --full

根据提示选择想要查询的链(这里我们为了测试方便,选择 zkSync Sepolia Testnet

? Chain to use (Use arrow keys)
> zkSync Sepolia Testnet
  zkSync Mainnet
  zkSync Goerli Testnet
  In-memory local node
  Dockerized local node

根据提示输入交易哈希:0xb427c3abd0397caeaea64a18dbf2ad7b699c5da49fa54dd31d3267f63341d8ea

? Transaction hash 0xb427c3abd0397caeaea64a18dbf2ad7b699c5da49fa54dd31d3267f63341d8ea

回车后,zksync-cli 就可以为我们查询到对应的交易详情

──────────────────── Main info ────────────────────
Transaction hash: 0xb427c3abd0397caeaea64a18dbf2ad7b699c5da49fa54dd31d3267f63341d8ea
Status: completed
From: 0xF24D120C43a07D8A1005A0d4B7AA39b9aD775BE2
To: 0x75A8597FD8AfC39eAe22687E57609E54Fb663e7C  |  Implementation: 0x27abc420b5bd48761c1984dcafc9201386566c69
Value: 0 ETH
Fee: 0.0000360583 ETH  |  Initial: 0.0000968742 ETH  Refunded: 0.00008019074 ETH
Method: 0x8ce7b106

───────────────────── Details ─────────────────────
Date: 2024/4/7 22:26:31 (2 hours ago)
Block: #1513166
Nonce: 7
Transaction type: 2
Ethereum commit hash: 0xbac8f789c32418a0918756d3d3091e04ef2106185d5d9fb98cd000faf0cc7db3
Ethereum prove hash: in progress
Ethereum execute hash: in progress

2.5 create

用于快速创建项目(前端、智能合约和脚本)。

npx zksync-cli create

create

2.6 wallet

用于管理与钱包相关的功能(转账、余额查询等)。

  • 余额查询
npx zksync-cli wallet balance [options]

options:

  • --address:想要查询余额的地址

  • --token:如果想要查询 ERC20 代币,可以添加此参数,并传入合约地址

  • --chain:指定在哪条链上查询

  • --rpc:指定 RPC URL

下面我们根据之前的例子,查询 0xa1cf087DB965Ab02Fb3CFaCe1f5c63935815f044 在测试网上的代币余额

npx zksync-cli wallet balance
--address 0xa1cf087DB965Ab02Fb3CFaCe1f5c63935815f044
--token 0x45E6dC995113fd3d1A3b1964493105B9AA9a9A42
--chain zksync-sepolia

查询结果

zkSync Sepolia Testnet Balance: 999999 DTN (DefaultTokenName)

当然,如果只是查询以太余额,我们可以只输入 npx zksync-cli wallet balance 命令并回车,zksync-cli 会自动提示我们选择要查询的链和想要查询的地址。

2.7 bridge

用于处理以太网和 zkSync 之间跨链操作。

  • 使用 deposit 将资产 从 L1 转移到 L2
npx zksync-cli bridge deposit
  • 使用 withdraw 将资产 从 L2 转移到 L1
npx zksync-cli bridge withdraw

3 zkSync Remix

Remix IDE 也支持 zkSync 合约开发,只需要我们安装对应插件即可。下面我们将演示如何结合 zksync-cli 搭建本地开发环境,并部署一个最简单的合约。

3.1 开启本地开发环境

在命令行工具中执行 npx zksync-cli dev start(需要启动 docker )。

3.2 安装插件

点击左边菜单栏底部的 插件管理 选项,搜索 ZKSYNC 并启用插件。启用成功后可以在左边菜单栏中看到 zkSync 的 Logo,我们点击它进入 zkSync 的开发环境。

3.3 案例测试

  1. 新建文件 HelloZkSync.sol

  2. 编辑合约。

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

contract HelloZkSync {
    string public str = "Hello zkSync!";
}
  1. 编译合约,点击 Compile HelloZkSync.sol 进行编译。

  2. 部署合约,在下方 Environment selection 中选择 Local Devnet,并部署 HelloZkSync 合约。

  1. 合约交互,部署成功后,点击 str 即可在控制台中看到 "Hello zkSync!" 输出。至此,我们就完成了使用 Remix IDE 开发一个简单的智能合约。

4 Hardhat plugins

zkSync 官方也提供了 Hardhat 支持,并且我们可以使用 zksync-cli 快速创建 Hardhat 项目。

npx zksync-cli create

根据提示输入项目名称,选择 Contracts 选项,根据自己的需求选择 Ethers 版本(v6 / v5)、 智能合约语言(Solidity / Vyper)、部署私钥(可选)和依赖包管理方式。创建完成后即可使用 Hardhat 在 zkSync 上开发智能合约。

5 Foundry with zkSync

foundry-zksync 允许用户使用 foundry 在 zkSync 上进行智能合约开发,引入 zkforgezkcast 扩展了原有的 forgecast 使开发人员能更加便捷地在 zkSync 进行开发。

6 zksync-ethers

zksync-ethers 扩展了 ethers 库以支持 zkSync 特有的功能(如账户抽象)。

6.1 安装

pnpm i zksync-ethers ethers@6

6.2 连接到 zkSync Era 网络

import { Provider, utils, types } from "zksync-ethers";
import { ethers } from "ethers";

const provider = Provider.getDefaultProvider(types.Network.Sepolia); // zkSync Era testnet (L2)
const ethProvider = ethers.getDefaultProvider("sepolia"); // Sepolia testnet (L1)

7 zkSync Python SDK

zkSync提供了一套类似web3.py的python解决方案,方便用户使用python在zkSync进行链上交互。

7.1 安装

安装前请检查下列需求是否满足:

  • Python >= 3.8
  • Pip >= 23.1.2
  • Web3.py >= 6.0.0

之后使用以下命令行通过pip安装zksync2的最新版本

pip install zksync2==1.0.0

7.2 使用

由于zksync2中大部分操作均与web3相类似,下边仅列出常用的不同点。其他的使用细节请参考zksync2web3的文档

  1. 与web3.py略有不同,zksync2需要同时初始化L1和L2两个Network Provider

    ETH_PROVIDER = "https://rpc.ankr.com/eth_sepolia"
    ZKSYNC_PROVIDER = "https://sepolia.era.zksync.dev"
    
    # Connect to Ethereum network
    eth_web3 = Web3(Web3.HTTPProvider(ETH_PROVIDER))
    
    # Connect to zkSync network
    zk_web3 = ZkSyncBuilder.build(ZKSYNC_PROVIDER)
  2. zksync2将部分的钱包操作打包进了Wallet对象,从而使用户无需重头构建交易。Wallet实例可以通过L1和L2的Network Provider和一个由私钥生成的eth-account构成:

    # Get account object by providing from private key
    account: LocalAccount = Account.from_key(PRIVATE_KEY)
    
    # Create Ethereum provider
    wallet = Wallet(zk_web3, eth_web3, account)

    以下是一个使用Wallet实例从主网跨链到zksync的代码段

    tx_hash = wallet.deposit(DepositTransaction(token=Token.create_eth().l1_address,
                                                     amount=Web3.to_wei(amount, "ether"),
                                                     to=wallet.address))

    以下是一个使用Wallet实例转账的代码段

    tx_hash = wallet.transfer(TransferTransaction(
            to="0x0000000000000000000000000000000000000000",
            amount=Web3.to_wei(0.001, "ether")))
  3. zksync2同时提供了TxCreateContract和TxCreate2Contract两个封装类型以实现createcreate2两种合约生成方法。不同于web3,zksync2提供了一套专门的封装方法用于读取合约的bytecode和生成初始化函数的calldata。

    下边是一个使用TxCreateContract生成合约的代码段

    # Get contract ABI and bytecode information
    incrementer_contract = ContractEncoder.from_json(zk_web3, compiled_contract)[0]
    
    # Encode the constructor arguments
    encoded_constructor = incrementer_contract.encode_constructor(**constructor_args)
    
    # Create deployment contract transaction
    create_contract = TxCreateContract(
         web3=zk_web3,
         chain_id=chain_id,
         nonce=nonce,
         from_=account.address,
         gas_price=gas_price,
         bytecode=incrementer_contract.bytecode,
         call_data=encoded_constructor,
    )

    请注意,发布于zksync的合约不同于主网及其他EVM兼容网络,需要由专门的编译器编译产生。详情请参阅本章的第3,第4节

更多使用zksync2的例子请参考 zkSync2 Examples