title | tags | |||
---|---|---|---|---|
4. 开发工具 |
|
这个系列教程帮助开发者入门 zkSync 开发。 推特:@0xAA_Science|@WTFAcademy_
所有代码和教程开源在 github: github.com/WTFAcademy/WTF-zkSync
这一讲,我们将介绍 zkSync 的生态和一些常用的工具。
zkSync CLI 是一个用于简化 zkSync 开发与交互的命令行工具。它提供了诸如管理本地开发环境、与合约交互、管理代币等功能的命令。它包含以下命令及对应功能:
用于管理本地开发环境
-
所需环境
-
使用
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
且不安装附加模块
。
用于配置自定义链,添加/编辑自定义链命令如下
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 )
用于操作链上合约(读、写等),使用 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 的强大还远不止于此。
用于查询链上交易信息(交易状态、转账金额、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
用于快速创建项目(前端、智能合约和脚本)。
npx zksync-cli create
用于管理与钱包相关的功能(转账、余额查询等)。
- 余额查询
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
会自动提示我们选择要查询的链和想要查询的地址。
用于处理以太网和 zkSync 之间跨链操作。
- 使用
deposit
将资产从 L1 转移到 L2
npx zksync-cli bridge deposit
- 使用
withdraw
将资产从 L2 转移到 L1
npx zksync-cli bridge withdraw
Remix IDE 也支持 zkSync 合约开发,只需要我们安装对应插件即可。下面我们将演示如何结合 zksync-cli
搭建本地开发环境,并部署一个最简单的合约。
在命令行工具中执行 npx zksync-cli dev start
(需要启动 docker )。
点击左边菜单栏底部的 插件管理
选项,搜索 ZKSYNC
并启用插件。启用成功后可以在左边菜单栏中看到 zkSync 的 Logo,我们点击它进入 zkSync 的开发环境。
-
新建文件
HelloZkSync.sol
。 -
编辑合约。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.21;
contract HelloZkSync {
string public str = "Hello zkSync!";
}
-
编译合约,点击
Compile HelloZkSync.sol
进行编译。 -
部署合约,在下方
Environment selection
中选择Local Devnet
,并部署HelloZkSync
合约。
- 合约交互,部署成功后,点击
str
即可在控制台中看到"Hello zkSync!"
输出。至此,我们就完成了使用 Remix IDE 开发一个简单的智能合约。
zkSync 官方也提供了 Hardhat 支持,并且我们可以使用 zksync-cli
快速创建 Hardhat 项目。
npx zksync-cli create
根据提示输入项目名称,选择 Contracts
选项,根据自己的需求选择 Ethers
版本(v6 / v5)、 智能合约语言
(Solidity / Vyper)、部署私钥(可选)和依赖包管理方式。创建完成后即可使用 Hardhat 在 zkSync 上开发智能合约。
foundry-zksync 允许用户使用 foundry 在 zkSync 上进行智能合约开发,引入 zkforge
和 zkcast
扩展了原有的 forge
和 cast
使开发人员能更加便捷地在 zkSync 进行开发。
zksync-ethers 扩展了 ethers
库以支持 zkSync 特有的功能(如账户抽象)。
pnpm i zksync-ethers ethers@6
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)
zkSync提供了一套类似web3.py的python解决方案,方便用户使用python在zkSync进行链上交互。
安装前请检查下列需求是否满足:
- Python >= 3.8
- Pip >= 23.1.2
- Web3.py >= 6.0.0
之后使用以下命令行通过pip安装zksync2的最新版本
pip install zksync2==1.0.0
由于zksync2中大部分操作均与web3相类似,下边仅列出常用的不同点。其他的使用细节请参考zksync2及web3的文档
-
与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)
-
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")))
-
zksync2同时提供了TxCreateContract和TxCreate2Contract两个封装类型以实现create和create2两种合约生成方法。不同于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