<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Deicision</title>
        <link>https://paragraph.com/@deicision</link>
        <description>咸鱼，偶尔分享一点技术相关的东西</description>
        <lastBuildDate>Tue, 04 Aug 2026 04:43:26 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <image>
            <title>Deicision</title>
            <url>https://storage.googleapis.com/papyrus_images/9404f6b962cb9691a0f50beed76783a8ee6768972d954c73dec37b66ff949f59.png</url>
            <link>https://paragraph.com/@deicision</link>
        </image>
        <copyright>All rights reserved</copyright>
        <item>
            <title><![CDATA[Zksync Era: 如何部署智能合约]]></title>
            <link>https://paragraph.com/@deicision/zksync-era</link>
            <guid>WOOa7IKKUC1LziNnZnbS</guid>
            <pubDate>Sat, 25 Mar 2023 16:05:30 GMT</pubDate>
            <description><![CDATA[昨天 Zksync 上线了 Era 主网，在测试的时候想部署合约试试，结果发现直接使用 Remix 无法部署合约 查阅了文档才发现 Zksync Era 和 EVM 部署合约的流程不一样，甚至有自己的一套 sol 编译方法 https://era.zksync.io/docs/ 先试了用 python 来部署发现不太行，python-sdk 和节点的 RPC 似乎还没有对齐，所以在使用的时候会报错。最后是用 Hardhat 部署上去了，踩坑一晚上，社区也还没有相关的提问所以分享一下。环境准备hardhat 需要在 yarn 中配置，需要预先配置 yarn 环境 https://yarnpkg.com/getting-started/install 然后创建一个目录作为工作目录，并且使用 yarn 配置好 zksync 的 hardhat环境mkdir example cd example yarn init -y yarn add -D typescript ts-node @types/node ethers@^5.7.2 zksync-web3 @ethersproject/...]]></description>
            <content:encoded><![CDATA[<p>昨天 Zksync 上线了 Era 主网，在测试的时候想部署合约试试，结果发现直接使用 Remix 无法部署合约</p><p>查阅了文档才发现 Zksync Era 和 EVM 部署合约的流程不一样，甚至有自己的一套 sol 编译方法</p><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://era.zksync.io/docs/">https://era.zksync.io/docs/</a></p><p>先试了用 python 来部署发现不太行，python-sdk 和节点的 RPC 似乎还没有对齐，所以在使用的时候会报错。最后是用 Hardhat 部署上去了，踩坑一晚上，社区也还没有相关的提问所以分享一下。</p><h2 id="h-" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">环境准备</h2><p>hardhat 需要在 yarn 中配置，需要预先配置 yarn 环境</p><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://yarnpkg.com/getting-started/install">https://yarnpkg.com/getting-started/install</a></p><p>然后创建一个目录作为工作目录，并且使用 yarn 配置好 zksync 的 hardhat环境</p><pre data-type="codeBlock" text="mkdir example
cd example
yarn init -y
yarn add -D typescript ts-node @types/node ethers@^5.7.2 zksync-web3 @ethersproject/hash @ethersproject/web hardhat @matterlabs/hardhat-zksync-solc @matterlabs/hardhat-zksync-deploy
"><code>mkdir example
cd example
yarn init <span class="hljs-operator">-</span>y
yarn add <span class="hljs-operator">-</span>D typescript ts<span class="hljs-operator">-</span>node @types<span class="hljs-operator">/</span>node ethers@<span class="hljs-operator">^</span><span class="hljs-number">5.7</span><span class="hljs-number">.2</span> zksync<span class="hljs-operator">-</span>web3 @ethersproject<span class="hljs-operator">/</span>hash @ethersproject<span class="hljs-operator">/</span>web hardhat @matterlabs<span class="hljs-operator">/</span>hardhat<span class="hljs-operator">-</span>zksync<span class="hljs-operator">-</span>solc @matterlabs<span class="hljs-operator">/</span>hardhat<span class="hljs-operator">-</span>zksync<span class="hljs-operator">-</span>deploy
</code></pre><p>最后输入 <code>yarn</code>命令初始化一下环境</p><p>在这个工作目录下创建 <code>hardhat.config.ts</code> 文件</p><pre data-type="codeBlock" text="import &quot;@matterlabs/hardhat-zksync-deploy&quot;;
import &quot;@matterlabs/hardhat-zksync-solc&quot;;

module.exports = {
  zksolc: {
    version: &quot;1.3.5&quot;,
    compilerSource: &quot;binary&quot;,
    settings: {},
  },
  defaultNetwork: &quot;zkTestnet&quot;,
  networks: {
    zkTestnet: {
      url: &quot;https://zksync2-testnet.zksync.dev&quot;, // URL of the zkSync network RPC
      ethNetwork: &quot;goerli&quot;, // Can also be the RPC URL of the Ethereum network (e.g. `https://goerli.infura.io/v3/&lt;API_KEY&gt;`)
      zksync: true,
    },
  },
  solidity: {
    version: &quot;0.8.17&quot;,
  },
};
"><code><span class="hljs-keyword">import</span> <span class="hljs-string">"@matterlabs/hardhat-zksync-deploy"</span>;
<span class="hljs-keyword">import</span> <span class="hljs-string">"@matterlabs/hardhat-zksync-solc"</span>;

module.exports <span class="hljs-operator">=</span> {
  zksolc: {
    version: <span class="hljs-string">"1.3.5"</span>,
    compilerSource: <span class="hljs-string">"binary"</span>,
    settings: {},
  },
  defaultNetwork: <span class="hljs-string">"zkTestnet"</span>,
  networks: {
    zkTestnet: {
      url: <span class="hljs-string">"https://zksync2-testnet.zksync.dev"</span>, <span class="hljs-comment">// URL of the zkSync network RPC</span>
      ethNetwork: <span class="hljs-string">"goerli"</span>, <span class="hljs-comment">// Can also be the RPC URL of the Ethereum network (e.g. `https://goerli.infura.io/v3/&#x3C;API_KEY>`)</span>
      zksync: <span class="hljs-literal">true</span>,
    },
  },
  solidity: {
    version: <span class="hljs-string">"0.8.17"</span>,
  },
};
</code></pre><p>国内环境下还需要在<code>zksolc-setting</code>中添加一个配置项，这个路径指向 zksync 的 <code>zksolc</code> 编译器。（也可以考虑设置代理，但是我这边代理一直下不了。）</p><pre data-type="codeBlock" text="    settings: {
      &quot;compilerPath&quot;: &quot;pathToCompile&quot;
    },
"><code>    settings: {
      "compilerPath": <span class="hljs-string">"pathToCompile"</span>
    },
</code></pre><p>同时，从下面的 github 中选取并下载 <code>zksolc</code> 编译器到对应的路径下</p><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/matter-labs/zksolc-bin">https://github.com/matter-labs/zksolc-bin</a></p><p>如果在主网部署，在 <code>networks</code> 中添加<code>zkMainnet</code></p><pre data-type="codeBlock" text="    zkMainnet: {
      url: &quot;https://zksync2-mainnet.zksync.io&quot;,
      ethNetwork: &quot;mainnet&quot;,
      zksync: true
    }
"><code>    <span class="hljs-attr">zkMainnet:</span> {
      <span class="hljs-attr">url:</span> <span class="hljs-string">"https://zksync2-mainnet.zksync.io"</span>,
      <span class="hljs-attr">ethNetwork:</span> <span class="hljs-string">"mainnet"</span>,
      <span class="hljs-attr">zksync:</span> <span class="hljs-literal">true</span>
    }
</code></pre><p>至此，部署合约的环境准备就绪，如果需要切换到主网，可以在配置文件中修改<code>defaultNetwork</code>字段</p><h2 id="h-" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">合约部署</h2><p>在工作目录下创建 <code>contracts</code> 文件夹，然后将写好的合约放入，因为是 zkEVM，所以合约同样是 solidity 语言，不同的只是合约部署的过程不一样</p><p>官方文档中的示例合约：</p><pre data-type="codeBlock" text="//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;
    }
}
"><code><span class="hljs-comment">//SPDX-License-Identifier: Unlicensed</span>
<span class="hljs-meta"><span class="hljs-keyword">pragma</span> <span class="hljs-keyword">solidity</span> ^0.8.0;</span>

<span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">Greeter</span> </span>{
    <span class="hljs-keyword">string</span> <span class="hljs-keyword">private</span> greeting;

    <span class="hljs-function"><span class="hljs-keyword">constructor</span>(<span class="hljs-params"><span class="hljs-keyword">string</span> <span class="hljs-keyword">memory</span> _greeting</span>) </span>{
        greeting <span class="hljs-operator">=</span> _greeting;
    }

    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">greet</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> <span class="hljs-title"><span class="hljs-keyword">view</span></span> <span class="hljs-title"><span class="hljs-keyword">returns</span></span> (<span class="hljs-params"><span class="hljs-keyword">string</span> <span class="hljs-keyword">memory</span></span>) </span>{
        <span class="hljs-keyword">return</span> greeting;
    }

    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">setGreeting</span>(<span class="hljs-params"><span class="hljs-keyword">string</span> <span class="hljs-keyword">memory</span> _greeting</span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> </span>{
        greeting <span class="hljs-operator">=</span> _greeting;
    }
}
</code></pre><p>然后在命令行中输入</p><pre data-type="codeBlock" text=" yarn hardhat compile
"><code> yarn hardhat <span class="hljs-built_in">compile</span>
</code></pre><p>在编译完成后会在工作目录下生成两个目录：artifacts-zk 和 cache-zk</p><p>然后创建 <code>deploy</code> 文件夹，在这个文件夹下创建 <code>deploy.ts</code>文件，写入下面的内容，请根据自己合约的需求进行修改</p><p><strong>注意：需要部署的合约的文件名务必和合约名一致</strong></p><pre data-type="codeBlock" text="import { utils, Wallet } from &quot;zksync-web3&quot;;
import * as ethers from &quot;ethers&quot;;
import { HardhatRuntimeEnvironment } from &quot;hardhat/types&quot;;
import { Deployer } from &quot;@matterlabs/hardhat-zksync-deploy&quot;;

// 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`);

  // 初始化钱包，这里替换为字符串形式的私钥
  const wallet = new Wallet(&quot;&lt;WALLET-PRIVATE-KEY&gt;&quot;);

  // 创建 deployer 对象，并且从abi中初始化合约对象 artifact
  const deployer = new Deployer(hre, wallet);
  // 这里是官方示例中的名为 Greeter 合约，需要根据具体的合约名字修改
  // 注意，合约名字务必和合约文件名一样
  const artifact = await deployer.loadArtifact(&quot;Greeter&quot;);

  // 从水龙头请求一些 eth 用来进行部署，如果钱包中有代币，可以直接注释掉这一段代码
  const depositAmount = ethers.utils.parseEther(&quot;0.001&quot;);
  const depositHandle = await deployer.zkWallet.deposit({
    to: deployer.zkWallet.address,
    token: utils.ETH_ADDRESS,
    amount: depositAmount,
  });
  // 等待水龙头发送测试币？
  await depositHandle.wait();

  // 部署合约，这里的 greeting 是示例合约的构造参数，请根据需要进行修改
  const greeting = &quot;Hi there!&quot;;
  const greeterContract = await deployer.deploy(artifact, [greeting]);

  // 输出合约的相关信息
  const contractAddress = greeterContract.address;
  console.log(`${artifact.contractName} was deployed to ${contractAddress}`);

  // 调用已经部署的合约
  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 = &quot;Hey guys&quot;;
  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}`);
  }
}
"><code><span class="hljs-keyword">import</span> { <span class="hljs-title">utils</span>, <span class="hljs-title">Wallet</span> } <span class="hljs-title"><span class="hljs-keyword">from</span></span> <span class="hljs-string">"zksync-web3"</span>;
<span class="hljs-keyword">import</span> <span class="hljs-operator">*</span> <span class="hljs-title"><span class="hljs-keyword">as</span></span> <span class="hljs-title">ethers</span> <span class="hljs-title"><span class="hljs-keyword">from</span></span> <span class="hljs-string">"ethers"</span>;
<span class="hljs-keyword">import</span> { <span class="hljs-title">HardhatRuntimeEnvironment</span> } <span class="hljs-title"><span class="hljs-keyword">from</span></span> <span class="hljs-string">"hardhat/types"</span>;
<span class="hljs-keyword">import</span> { <span class="hljs-title">Deployer</span> } <span class="hljs-title"><span class="hljs-keyword">from</span></span> <span class="hljs-string">"@matterlabs/hardhat-zksync-deploy"</span>;

<span class="hljs-comment">// An example of a deploy script that will deploy and call a simple contract.</span>
export default async <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">hre: HardhatRuntimeEnvironment</span>) </span>{
  console.log(`Running deploy script <span class="hljs-keyword">for</span> the Greeter <span class="hljs-class"><span class="hljs-keyword">contract</span>`);

  <span class="hljs-comment">// 初始化钱包，这里替换为字符串形式的私钥</span>
  <span class="hljs-title">const</span> <span class="hljs-title">wallet</span> = <span class="hljs-title"><span class="hljs-keyword">new</span></span> <span class="hljs-title">Wallet</span>(<span class="hljs-params"><span class="hljs-string">"&#x3C;WALLET-PRIVATE-KEY>"</span></span>);

  <span class="hljs-comment">// 创建 deployer 对象，并且从abi中初始化合约对象 artifact</span>
  <span class="hljs-title">const</span> <span class="hljs-title">deployer</span> = <span class="hljs-title"><span class="hljs-keyword">new</span></span> <span class="hljs-title">Deployer</span>(<span class="hljs-params">hre, wallet</span>);
  <span class="hljs-comment">// 这里是官方示例中的名为 Greeter 合约，需要根据具体的合约名字修改</span>
  <span class="hljs-comment">// 注意，合约名字务必和合约文件名一样</span>
  <span class="hljs-title">const</span> <span class="hljs-title">artifact</span> = <span class="hljs-title">await</span> <span class="hljs-title">deployer</span>.<span class="hljs-title">loadArtifact</span>(<span class="hljs-params"><span class="hljs-string">"Greeter"</span></span>);

  <span class="hljs-comment">// 从水龙头请求一些 eth 用来进行部署，如果钱包中有代币，可以直接注释掉这一段代码</span>
  <span class="hljs-title">const</span> <span class="hljs-title">depositAmount</span> = <span class="hljs-title">ethers</span>.<span class="hljs-title">utils</span>.<span class="hljs-title">parseEther</span>(<span class="hljs-params"><span class="hljs-string">"0.001"</span></span>);
  <span class="hljs-title">const</span> <span class="hljs-title">depositHandle</span> = <span class="hljs-title">await</span> <span class="hljs-title">deployer</span>.<span class="hljs-title">zkWallet</span>.<span class="hljs-title">deposit</span>(<span class="hljs-params">{
    to: deployer.zkWallet.<span class="hljs-keyword">address</span>,
    token: utils.ETH_ADDRESS,
    amount: depositAmount,
  }</span>);
  <span class="hljs-comment">// 等待水龙头发送测试币？</span>
  <span class="hljs-title">await</span> <span class="hljs-title">depositHandle</span>.<span class="hljs-title">wait</span>(<span class="hljs-params"></span>);

  <span class="hljs-comment">// 部署合约，这里的 greeting 是示例合约的构造参数，请根据需要进行修改</span>
  <span class="hljs-title">const</span> <span class="hljs-title">greeting</span> = "<span class="hljs-title">Hi</span> <span class="hljs-title">there</span>!";
  <span class="hljs-title">const</span> <span class="hljs-title">greeterContract</span> = <span class="hljs-title">await</span> <span class="hljs-title">deployer</span>.<span class="hljs-title">deploy</span>(<span class="hljs-params">artifact, [greeting]</span>);

  <span class="hljs-comment">// 输出合约的相关信息</span>
  <span class="hljs-title">const</span> <span class="hljs-title">contractAddress</span> = <span class="hljs-title">greeterContract</span>.<span class="hljs-title"><span class="hljs-keyword">address</span></span>;
  <span class="hljs-title">console</span>.<span class="hljs-title">log</span>(<span class="hljs-params">`${artifact.contractName} was deployed to ${contractAddress}`</span>);

  <span class="hljs-comment">// 调用已经部署的合约</span>
  <span class="hljs-title">const</span> <span class="hljs-title">greetingFromContract</span> = <span class="hljs-title">await</span> <span class="hljs-title">greeterContract</span>.<span class="hljs-title">greet</span>(<span class="hljs-params"></span>);
  <span class="hljs-title"><span class="hljs-keyword">if</span></span> (<span class="hljs-params">greetingFromContract == greeting</span>) </span>{
    console.log(`Contract greets us with ${greeting}<span class="hljs-operator">!</span>`);
  } <span class="hljs-keyword">else</span> {
    console.error(`Contract said something unexpected: ${greetingFromContract}`);
  }

  <span class="hljs-comment">// Edit the greeting of the contract</span>
  const newGreeting <span class="hljs-operator">=</span> <span class="hljs-string">"Hey guys"</span>;
  const setNewGreetingHandle <span class="hljs-operator">=</span> await greeterContract.setGreeting(newGreeting);
  await setNewGreetingHandle.wait();

  const newGreetingFromContract <span class="hljs-operator">=</span> await greeterContract.greet();
  <span class="hljs-keyword">if</span> (newGreetingFromContract <span class="hljs-operator">=</span><span class="hljs-operator">=</span> newGreeting) {
    console.log(`Contract greets us with ${newGreeting}<span class="hljs-operator">!</span>`);
  } <span class="hljs-keyword">else</span> {
    console.error(`Contract said something unexpected: ${newGreetingFromContract}`);
  }
}
</code></pre><p>Zksync 官方的演示文档：</p><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://era.zksync.io/docs/api/hardhat/getting-started.html#write-and-deploy-a-contract">https://era.zksync.io/docs/api/hardhat/getting-started.html#write-and-deploy-a-contract</a></p>]]></content:encoded>
            <author>deicision@newsletter.paragraph.com (Deicision)</author>
            <enclosure url="https://storage.googleapis.com/papyrus_images/02b44dbd1cb8dff240889c1c258467d6c06882787d97eb7308471cda24f88b3b.png" length="0" type="image/png"/>
        </item>
    </channel>
</rss>