<?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>Ramondy</title>
        <link>https://paragraph.com/@ramondy</link>
        <description>undefined</description>
        <lastBuildDate>Sat, 09 May 2026 17:19:07 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <image>
            <title>Ramondy</title>
            <url>https://storage.googleapis.com/papyrus_images/98b24065329f664f784ad565669b3e94df87f4da2f2651b06a0050f20c8b5edc.jpg</url>
            <link>https://paragraph.com/@ramondy</link>
        </image>
        <copyright>All rights reserved</copyright>
        <item>
            <title><![CDATA[曲折的Smart Contract验证之路]]></title>
            <link>https://paragraph.com/@ramondy/smart-contract</link>
            <guid>QXMvEMxEecHNuF2Z4WTT</guid>
            <pubDate>Tue, 18 Jul 2023 08:13:39 GMT</pubDate>
            <description><![CDATA[1. 合约验证我们知道在智能合约的部署之后，需要将部署的合约进行验证，并公开给用户查看。这种作为已经成为一个产品上线后的必备操作。1.1 合约验证方法1. 通过区块链浏览器进行验证这种方式是区块链部署后，进行验证时候，比较通用的验证方式。我们需要选择编译类型： 通常选择为Solidity(Simgle file) 也就是将所有合约导入到一个合约文件中，也称为合约的扁平化处理 开元许可证类型通常选择MIT Licence(MIT)此时我想你一定在头大，难道需要我们自己一个个的将引入的文件复制到一个文件中吗？（这肯定行不通，因为引入的文件通常很多，一不小心还会出错）sol-merger : Merges all imports into single file for solidity contracts上述插件可以实现将引入的合约导入到一个单独的文件中。是不是很方便。 使用方法还是很简单的： 在package.json 配置添加如下代码：{ "scripts": { "build-contracts": "sol-merger \"./contracts/*.sol\" ./bui...]]></description>
            <content:encoded><![CDATA[<h2 id="h-1" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">1. 合约验证</h2><p>我们知道在智能合约的部署之后，需要将部署的合约进行验证，并公开给用户查看。这种作为已经成为一个产品上线后的必备操作。</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/8d6ea8c7c4baf24c0ba1eee90d6bfe4c7f9ac9e47b8ae1a953dae977387be5bc.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p><strong>1.1 合约验证方法</strong></p><h4 id="h-1" class="text-xl font-header !mt-6 !mb-3 first:!mt-0 first:!mb-0">1. 通过区块链浏览器进行验证</h4><p>这种方式是区块链部署后，进行验证时候，比较通用的验证方式。</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/58001c2be7b641b8c489bd82dd3206a086861cbd19bc7590fda28f585ea6213d.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>我们需要选择编译类型： 通常选择为Solidity(Simgle file) 也就是将所有合约导入到一个合约文件中，也称为合约的扁平化处理</p><p>开元许可证类型通常选择MIT Licence(MIT)</p><blockquote><p>此时我想你一定在头大，难道需要我们自己一个个的将引入的文件复制到一个文件中吗？（这肯定行不通，因为引入的文件通常很多，一不小心还会出错）</p></blockquote><blockquote><p>sol-merger : Merges all imports into single file for solidity contracts</p></blockquote><p>上述插件可以实现将引入的合约导入到一个单独的文件中。是不是很方便。</p><p>使用方法还是很简单的：</p><p>在package.json 配置添加如下代码：</p><pre data-type="codeBlock" text="{
  &quot;scripts&quot;: {
    &quot;build-contracts&quot;: &quot;sol-merger \&quot;./contracts/*.sol\&quot; ./build&quot;
  }
}
"><code>{
  <span class="hljs-string">"scripts"</span>: {
    <span class="hljs-string">"build-contracts"</span>: <span class="hljs-string">"sol-merger <span class="hljs-subst">\"</span>./contracts/*.sol<span class="hljs-subst">\"</span> ./build"</span>
  }
}
</code></pre><blockquote><p>注意此时的合约文件夹的位置。我在验证的时候没有<strong>注意合约文件夹的变动</strong>，导致用到了错位的扁平化代码。</p></blockquote><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/e62e30509f71ada4889f54101a42afd5144ed6245ade3794e7d92e258524d9b0.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><blockquote><p>在这个过程我们可以将扁平化代码放入2位置。1的位置要根据Hardhat 编译器的配置进行选择。3的constructor Arguments Abi encoded是系统自动填充的我们不需要进行修改。这块的代码其实是我们进行合约部署时候的参数。</p></blockquote><p>如果你仔细看过部署合约的交易时候会发现，在部署合约的时候我们在input data中看到过一串编译过的代码，如下图看到的：</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/e001da51f2eebf40364fc7fd8061529e87c24b72e00ef750101de3cfa61ed8fe.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>上图中中的编译代码就是constructor 含参数进行编译后的数据。我们可以用hex 转文本等看到原始的数据信息。而这个编译码的上面就是整个合约信息。</p><blockquote><p>记住： 区块链浏览器说： remix编译通过，验证也应该可以，没错的。</p></blockquote><p>如果顺利的话，你的合约已经可以看到代码了。</p><p>但是本文的重点并不是在这里，因为我的合约没能够通过验证。接下来我将通过代码演示我在合约合约验证的过程，以及合约验证的另外两种方式。</p><p>如果你的合约也验证失败了，希望这篇文章给你带来帮助。</p><h2 id="h-2" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">2. 合约不验证的影响</h2><p>之所以将这个标题写在这里，是为了警示大家， 告诉大家合格的产品是必须进行合约曝光的。</p><p>作为一个合约开发者，如果你讲重要的合约，比如你们公司正在做一款游戏，你们已经部署了一个ERC721合约，并且已经进行了空投和其他的几轮活动，那么此时这个合约必须马上进行公开，因为合约的公开有助于用户了解到你们产品时候存在后门等情况。</p><p>如果此时你忘记了部署时候的合约，那么此时可能已经可以“提桶跑路”了。</p><blockquote><p>别慌，稳住。上面说的话虽然是真的，但是也是能够进行补救的。</p></blockquote><h2 id="h-3" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">3. 合约验证标准</h2><p>能够将这以下的行为操作称为标准，完全是血的教训。</p><h3 id="h-31" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">3.1 教训一：及时验证</h3><p>合约的在部署后，尽快的进行验证，我们知道solidity代码进行代码编译过程是不可逆的，也就说能够拿到合约部署时候的编译码，是不能够进行反编译解码成solidity 代码。这一点一定要记住。</p><p>如果因为安全性考虑，没有进行合约验证，此时一定要保存代码，最好也保存一份bytecode。（关键时刻救命）</p><h3 id="h-32-remix-ide" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">3.2 教训二：部署切勿更改任何remix ide中的代码</h3><p>我们认为在remix进行合约部署，合约修改是很方便的。但是应该知道remix ide基础浏览器缓存。如果删除缓存，你编辑的代码也就不存在了。</p><p>假设你的浏览器还保存着数据，但是如果你在remix进行代码的更改没有同步到本地代码中， 那么此时的验证还是不能够通过。</p><p>这两种行为都是在合约验证中致命的存在。</p><h3 id="h-33" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">3.3 教训三： 时刻进行代码的推送</h3><p>能够救命的操作，肯定是时刻的进行代码的推送，他也是你还原代码的重要依据，但是，前提是一定不要做上述的操作，否则这种代码推送也只会减少一定验证工作量。</p><h3 id="h-34" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">3.4 教训四：代码存档</h3><p>在游戏中如果我想要进入别的故事情节，我可以选择不同的存档时间，在Smart contract 中也需要对生产上的代码数据进行存储，并且，一定不要进行其他的代码更改。（包括你认为的存在引入代码重复操作）</p><h2 id="h-4" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">4. 合约验证方式</h2><h3 id="h-41-hardhat" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">4.1 hardhat 验证</h3><blockquote><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://hardhat.org/hardhat-runner/docs/guides/verifying">https://hardhat.org/hardhat-runner/docs/guides/verifying</a></p></blockquote><blockquote><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://hardhat.org/hardhat-runner/plugins/nomicfoundation-hardhat-verify">https://hardhat.org/hardhat-runner/plugins/nomicfoundation-hardhat-verify</a></p></blockquote><p>步骤</p><ul><li><p>安装依赖</p></li></ul><pre data-type="codeBlock" text="npm install --save-dev @nomicfoundation/hardhat-verify
"><code>npm install <span class="hljs-operator">-</span><span class="hljs-operator">-</span>save<span class="hljs-operator">-</span>dev @nomicfoundation<span class="hljs-operator">/</span>hardhat<span class="hljs-operator">-</span>verify
</code></pre><ul><li><p>获取API key 从不同链的浏览器中</p></li><li><p>hardhat.config 添加etherscan配置</p></li></ul><pre data-type="codeBlock" text="import &quot;@nomicfoundation/hardhat-verify&quot;;

export default {
  // ...rest of the config...
  etherscan: {
    apiKey: &quot;ABCDE12345ABCDE12345ABCDE123456789&quot;,
  },
};
"><code><span class="hljs-keyword">import</span> <span class="hljs-string">"@nomicfoundation/hardhat-verify"</span>;

<span class="hljs-keyword">export</span> <span class="hljs-keyword">default</span> {
  <span class="hljs-comment">// ...rest of the config...</span>
  etherscan: {
    apiKey: <span class="hljs-string">"ABCDE12345ABCDE12345ABCDE123456789"</span>,
  },
};
</code></pre><ul><li><p>npx hardhat verify --network sepolia</p><pre data-type="codeBlock" text="npx hardhat verify --network polygon 0x80000000000000000000000000000000 &quot;Tearing Spaces: Celestial Armaments&quot; &quot;Armaments&quot; &quot;0x92b62f87b6a09494acbe0eeddd2ec5f02934c7f4&quot; 500
"><code>npx hardhat verify <span class="hljs-operator">-</span><span class="hljs-operator">-</span>network polygon <span class="hljs-number">0x80000000000000000000000000000000</span> <span class="hljs-string">"Tearing Spaces: Celestial Armaments"</span> <span class="hljs-string">"Armaments"</span> <span class="hljs-string">"0x92b62f87b6a09494acbe0eeddd2ec5f02934c7f4"</span> <span class="hljs-number">500</span>
</code></pre><h2 id="h-4" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">4. 总结</h2><p>本文介绍了智能合约在部署后需要进行合约验证的方法，主要包括通过区块链浏览器进行验证、使用sol-merger插件将所有合约导入到一个单独的文件中等方式。同时，提出了在合约验证过程中需要注意的事项，如及时验证、部署时勿更改任何remix ide中的代码、时刻进行代码的推送以及代码存档等。作者强调，合约的公开有助于用户了解到产品存在后门等情况，因此合约的公开是必须进行的。</p></li></ul>]]></content:encoded>
            <author>ramondy@newsletter.paragraph.com (Ramondy)</author>
            <enclosure url="https://storage.googleapis.com/papyrus_images/5d1c24f8dc6d48fb7537cd4576cabeeb3631ca5379148966cd37ee49be3e7eeb.png" length="0" type="image/png"/>
        </item>
    </channel>
</rss>