<?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>Boyn</title>
        <link>https://paragraph.com/@boynn</link>
        <description>Developer in Tiktok, Bytedance.
Developer who love rust, go, solidity.
Web3 Beginner</description>
        <lastBuildDate>Tue, 07 Apr 2026 13:50:18 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <image>
            <title>Boyn</title>
            <url>https://storage.googleapis.com/papyrus_images/4dfa413a2f312c275f54a77b35fe71f100ce594ad7807891e6366054e604ca4d.jpg</url>
            <link>https://paragraph.com/@boynn</link>
        </image>
        <copyright>All rights reserved</copyright>
        <item>
            <title><![CDATA[【爆炒Web3】如何获得你的第一个ETH]]></title>
            <link>https://paragraph.com/@boynn/web3-eth</link>
            <guid>YKdOx5Rya5vGsiUOzgzc</guid>
            <pubDate>Sun, 29 Jan 2023 02:28:41 GMT</pubDate>
            <description><![CDATA[什么是加密货币加密货币，也称为数字货币或虚拟货币，是使用密码学技术进行记录和验证交易的货币。最著名的加密货币是比特币，它于2009年由匿名的个人或团体“中本聪”发明。加密货币通常使用区块链技术，这是一种分布式账本技术，可以记录所有交易并防止重复支出。 如果是比特币是第一代虚拟货币，那么以太坊就是第二代，也就是我们现在最广泛使用的加密货币。以太坊与比特币不同之处在于，比特币是一种纯粹的数字货币，而以太坊则是一种智能合约平台，允许开发者在上面构建和部署自己的去中心化应用。以太坊还提供了更为灵活的编程语言和更高效的交易执行机制。这使得以太坊能够扩展出更广泛的应用场景，如去中心化财务、游戏、数字资产等。因此，以太坊被认为是第二代加密货币。 以太坊是一个开源、公共、区块链平台，它允许人们使用智能合约和去中心化应用程序 (dApps) 建立和运行分布式应用程序。 与比特币不同，它是一个全功能的平台，可以用于不同类型的交易，如金融交易、游戏、电子商务等。 以太坊的货币是以太币 (ETH)，用于支付交易费用和激励网络中的节点。如何获得第一个以太坊想要获得以太坊？ 获得以太坊的方式有很多种，下面是...]]></description>
            <content:encoded><![CDATA[<h1 id="h-" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">什么是加密货币</h1><p>加密货币，也称为数字货币或虚拟货币，是使用密码学技术进行记录和验证交易的货币。最著名的加密货币是比特币，它于2009年由匿名的个人或团体“中本聪”发明。加密货币通常使用区块链技术，这是一种分布式账本技术，可以记录所有交易并防止重复支出。</p><p>如果是比特币是第一代虚拟货币，那么以太坊就是第二代，也就是我们现在最广泛使用的加密货币。以太坊与比特币不同之处在于，比特币是一种纯粹的数字货币，而以太坊则是一种智能合约平台，允许开发者在上面构建和部署自己的去中心化应用。以太坊还提供了更为灵活的编程语言和更高效的交易执行机制。这使得以太坊能够扩展出更广泛的应用场景，如去中心化财务、游戏、数字资产等。因此，以太坊被认为是第二代加密货币。</p><p>以太坊是一个开源、公共、区块链平台，它允许人们使用智能合约和去中心化应用程序 (dApps) 建立和运行分布式应用程序。 与比特币不同，它是一个全功能的平台，可以用于不同类型的交易，如金融交易、游戏、电子商务等。 以太坊的货币是以太币 (ETH)，用于支付交易费用和激励网络中的节点。</p><h1 id="h-" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">如何获得第一个以太坊</h1><p>想要获得以太坊？</p><p>获得以太坊的方式有很多种，下面是几种常见的方法：</p><h2 id="h-" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">通过交易所购买</h2><p>你可以使用美元、欧元或其他法定货币在交易所上购买以太坊。常见的交易所包括 Binance, Coinbase, Kraken 等。交易所是在线平台，允许用户使用法定货币（如美元、欧元、人民币等）购买和出售加密货币，其中包括以太坊。要购买以太坊，您需要先在交易所上注册账户并进行身份验证，然后使用法定货币或其他加密货币购买以太币。 一旦您拥有了以太币，就可以在交易所上进行买卖交易。注意交易所的安全性，交易所黑客攻击或者破产都可能导致您的资产损失，所以建议选择正规并且安全的交易所。</p><p>有很多交易所可供选择，其中一些是全球范围内的大型交易所，而另一些是地区性的或专注于特定加密货币的交易所。还有一些是去中心化的交易所。 一些全球范围内著名的交易所包括：</p><ul><li><p>Binance：支持多种语言和货币，具有高性能和安全性。</p></li><li><p>Coinbase：美国交易所，支持多种货币和语言，易于使用。</p></li><li><p>Kraken：支持多种货币和语言，具有高性能和安全性。</p></li><li><p>Bitfinex：具有高性能和安全性的交易所。</p></li><li><p>Huobi: 亚洲地区著名的交易所 这些交易所都是可信赖的，但在选择交易所时，建议进行足够的研究，了解交易所的费用、安全性和客户支持等方面的信息。 地区性的交易所可能会在特定地区或国家更受欢迎。举几个例子：</p></li><li><p>Bithumb: 韩国的一个著名交易所</p></li><li><p>BitFlyer: 日本的一个著名交易所</p></li><li><p>OKEx: 中国的一个著名交易所</p></li><li><p>Coinone : 韩国的一个著名交易所</p><p>这些交易所也是可信赖的，但是由于受地区法规限制，可能对外国用户的服务有限制。选择地区性的交易所时，建议了解该地区的加密货币法规情况以及交易所的服务范围。 去中心化交易所 (DEX) 是一种不需要中央机构管理和监督的交易所。它使用区块链技术，使用户能够直接在区块链上进行交易，而不需要第三方管理。 举几个例子：</p></li><li><p>Uniswap: 是一个基于以太坊区块链的去中心化交易所，支持 ERC20 代币和以太坊的交易。</p></li><li><p>Sushiswap：是一个基于以太坊区块链的去中心化交易所，也支持 ERC20 代币和以太坊的交易。</p></li><li><p>Kyber Network: 也是一个基于以太坊区块链的去中心化交易所，支持 ERC20 代币和以太坊的交易。 去中心化交易所通常不需要客户提供 KYC 身份验证信息，交易过程也不需要第三方管理。但是由于区块链技术仍处于发展阶段，去中心化交易所可能存在安全风险。建议在使用去中心化交易所之前进行足够的研究和评估。</p></li></ul><h2 id="h-" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">通过挖矿获得</h2><p>挖矿是获得以太坊的一种方式，它需要使用计算能力来解决复杂的数学问题，并且解出的第一个人将会得到一定数量的以太坊奖励。要想挖矿，需要以下几个步骤：</p><ol><li><p>下载以太坊钱包：首先需要下载一个钱包来存储挖到的以太坊，可以从官网上下载钱包客户端。</p></li><li><p>购买矿机或加入矿池：可以选择购买矿机来独立挖矿，也可以加入矿池，共同分享算力挖矿。</p></li><li><p>配置矿机或加入矿池：如果选择购买矿机，需要对矿机进行配置，如果选择加入矿池，需要使用钱包地址加入矿池。</p></li><li><p>开始挖矿：在配置完成后即可开始挖矿，如果挖到了第一个解决问题的人，将会得到以太坊奖励，并且奖励会自动发送到钱包地址中。 需要注意的是，挖矿需要耗费大量的电力和计算资源，如果自己挖矿，需要计算挖矿成本，而加入矿池可以减少成本，但需要分享奖励。</p></li></ol><h2 id="h-p2p" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">P2P交易</h2><p>你可以在线上或线下与其他用户交易购买以太坊。或者你可以在网上发布钱包地址，等待其他用户给你捐赠以太坊。 在进行P2P加密货币交易时，需要注意以下几点：</p><ol><li><p>选择安全的交易平台：选择口碑好且拥有完善安全机制的P2P交易平台。</p></li><li><p>交易对象的评估：评估交易对象的信誉，避免与骗子交易。</p></li><li><p>交易过程的安全：注意交易过程中的信息安全，不要在交易过程中泄露个人信息。</p></li><li><p>资金安全：在交易过程中，要确保资金安全，避免资金被骗。</p></li><li><p>交易证明：在交易过程中，保存好交易证明，以备后续沟通或纠纷解决。 总之，进行P2P加密货币交易时需要保持警惕，以确保安全。</p></li></ol>]]></content:encoded>
            <author>boynn@newsletter.paragraph.com (Boyn)</author>
        </item>
        <item>
            <title><![CDATA[RMRK，一个更有可玩性的NFT标准]]></title>
            <link>https://paragraph.com/@boynn/rmrk-nft</link>
            <guid>6LZaBkWe5BogFTEiwysE</guid>
            <pubDate>Fri, 27 Jan 2023 08:49:41 GMT</pubDate>
            <description><![CDATA[RMRK从哪⾥来？RMRK(发⾳为remark）是⼀套开源NFT2.0标准（称为RMRK标准），也是⼀家在此基础设施之 上构建产品的营利性公司。它由当时Web3基⾦会的技术教育家BrunoŠ kvorc于2020年创⽴。RMRK 最初是⼀个业余爱好项⽬，后来发展成为⼀个20⼈的团队。其中包含不到10⼈的开发团队。 RMRK是⼀组NFT标准，由⼏个“NFT2.0乐⾼”原语组成。将这些乐⾼积⽊放在⼀起允许⽤⼾创 建任意复杂度的NFT系统。说⽩了，RMRK团队想要打造很酷的产品，但是构建它们的基础设施还不 存在，所以他们选择先构建基础设施。现在每个⼈都可以使⽤此基础架构。下⾯的描述中，可能会把 RMRK这个名词作为NFT标准或者是⼀个团队，各位看官可以⾃⾏判断⼀下上下⽂，后⾯就不再区分。RMRK其实还有1.0的标准，⽬前从官⽹和开源的合约资料看来，与ERC721⽐较类似，只是在 metadata上⾯做出了⼀些创新与兼容。可以理解为RMRK团队的想法并不是原地盖⾼楼，要全⾯否定 ERC721，⽽是采取了站在巨⼈肩膀上⾯buidl的思路。这样的...]]></description>
            <content:encoded><![CDATA[<figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/bbc42a249eaf42f3c0c12312daa36a2c70b36a2cc12c16331d65291769aa92b8.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><h1 id="h-rmrk" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">RMRK从哪⾥来？</h1><p>RMRK(发⾳为remark）是⼀套开源NFT2.0标准（称为RMRK标准），也是⼀家在此基础设施之 上构建产品的营利性公司。它由当时Web3基⾦会的技术教育家BrunoŠ kvorc于2020年创⽴。RMRK 最初是⼀个业余爱好项⽬，后来发展成为⼀个20⼈的团队。其中包含不到10⼈的开发团队。 RMRK是⼀组NFT标准，由⼏个“NFT2.0乐⾼”原语组成。将这些乐⾼积⽊放在⼀起允许⽤⼾创 建任意复杂度的NFT系统。说⽩了，RMRK团队想要打造很酷的产品，但是构建它们的基础设施还不 存在，所以他们选择先构建基础设施。现在每个⼈都可以使⽤此基础架构。下⾯的描述中，可能会把 RMRK这个名词作为NFT标准或者是⼀个团队，各位看官可以⾃⾏判断⼀下上下⽂，后⾯就不再区分。</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/f6fc2cf44ae9e3223e2a920e6692529c7a817d4c10156990c78962417d6396a0.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>RMRK其实还有1.0的标准，⽬前从官⽹和开源的合约资料看来，与ERC721⽐较类似，只是在 metadata上⾯做出了⼀些创新与兼容。可以理解为RMRK团队的想法并不是原地盖⾼楼，要全⾯否定 ERC721，⽽是采取了站在巨⼈肩膀上⾯buidl的思路。这样的好处是显⽽易⻅的，对于⽤⼾⽽⾔，可 以显著地降低初⼊⽤⼾的⼼智成本与⻔槛，提⾼⽤⼾对于平台和协议的接受度；对于开发者⽽⾔，两 条链之间兼容的协议可以降低迁移与适配多链的成本。</p><p>RMRK在NFT标准之上，搭建了基于Kusama的NFT交易平台Singular。Kusama是波卡链的公开 测试链，他的代码，节点运⾏⽅式和治理模式等等，都与波卡链基本相似。但是他们的区别在于 Kusama⽆论是在技术还是在治理模式上，决策和投票的时间都会更短更加激进。Singular就是基于这 样⼀条链构建出来的NFT交易平台。作为RMRK团队的“亲⼉⼦”，Singular⾃然是⽀持RMRK2.0的全 部特性，拥有⽐Opensea更加丰富的可玩性与展⽰性。</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/eeccfead4d50302ce44102d6a7bf177bfe41b05c89e68c934847eef34f19c36f.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><h1 id="h-nft" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">为什么需要另⼀个NFT标准？</h1><p>诚然，RMRK会⽐ERC721更加复杂，更加多变。但是从软件发展的⻆度上⾯来看，系统的组成是 从简单到复杂，随着⾏业和模式的发展，复杂度将会逐渐上升，并且最终通过多次突变型的变化到达 ⼀个全新的⾼度。⽬前ERC20和ERC721都是⽬前使⽤最普遍，最⼴泛的代币（以孟岩⽼师的话来说是 通证）合约标准，他们分别代表着不同的代币组合⽅式，20代表着同质化货币，也就是可以叠加，可 以互相替代的代币，721代表着⾮同质化代币，它的特点就是不可组合，每⼀个都是独⼀⽆⼆的。这两 种最基本，也是最⼴泛使⽤的代币合约标准构建出了今天繁荣的NFT⽣态。并且我们看到随着市场的发 展与进⼀步趋于复杂化的商业模式，Token标准也在不断地进化。</p><p>⽽在20，721之后，我们可以看到1155，3525这些协议同样也在不断地将代币标准复杂化，以此 来增强代币能够在合约中做的事情。那么RMRK也是采取同样⼜不太⼀样的思路。同样的地⽅是，各种 Token标准想要做的事情，都是通过智能合约来反映真实的世界，通常来说都是以实际需求和真实世界 中的模型，来抽象成⼀个协议，以3525为例，是先有的市场，再有的轮⼦。不⼀样的思路是，⽬前的 标准是表⽰资产与持有⼈的关系，不同合约之间更像是⼀座孤岛（当然，这是对于链上数据⽽⾔）， 合约之间想要互通，没有⼀条现成的，标准的路。但是RMRK则通过⼀套标准化的协议，表⽰了资产与 资产之间的不同关系（从属，平⾏等），在不同的岛屿之间建⽴起了⼀座座桥。（看完后⾯的内容， 也许你会对这句话理解得更加深刻⼀些）</p><h1 id="h-rmrk" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">组成RMRK的基本概念</h1><h2 id="h-nestable" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">可嵌套(Nestable)</h2><p>嵌套NFT的概念是指NFT能够拥有其他NFT。 其核⼼原理很简单：NFT的所有者不⼀定是外部拥有的账⼾或智能合约，也可以是特定的NFT。 将NFT发送到另⼀个NFT的过程在功能上与发送到另⼀个⽤⼾相同。从另⼀个NFT发送⼀个NFT的过 程涉及从拥有parent的地址发出交易。 ⼀些NFT可以为⽗⼦关系配置特殊条件。例如：</p><p>• ⼀些⽗NFT将允许⼦NFT的所有者随时撤回该⼦NFT（例如包含化⾝的虚拟⼟地）</p><p>• ⼀些⽗NFT将被禁⽌对⼦NFT执⾏某些互动（例如，其他⼈的化⾝是客⼈的房⼦的所有者不应该能 够BURN客⼈）</p><p>• ⼀些⽗NFT会有特殊的退出条件，⽐如接受⾳乐词⼲的⾳乐NFT。主⼲可以被其所有者删除，直 到⼀定数量的共同作曲者对主⼲进⾏了⾜够的投票，或者直到⽗⾳乐曲⽬的所有者密封并“发 布”它</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/84ce446fc7e597affc5bc556091b1831c893f93a89e288f049030dd319c32fd0.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>在⽬前的很多游戏中，如果游戏停服了（暴雪……sosadformygames），那么⽤⼾的装备数据 恐怕是很难可以找得回来了。但是通过区块链的公开性与不可篡改性，我们不仅⼤部分时候不需要担 ⼼游戏停服所带来的困扰（⽬前的境地是并没有很多很好的链游+游戏中的装备其实没有复⽤价值， 所以先搭建基础设施的思路反⽽是正确的），反⽽还可以将⾃⼰的装备在不同的游戏中进⾏互通。 于是为了能够让各种资产能够互通，就需要⼀个⾏之有效，⾜够抽象的协议，不然每个应⽤搞⾃ ⼰的协议，⾃⼰的标准，其实就如同没有标准。在我看来，RMRK的嵌套标准就做到了⾜够的抽象与通 ⽤，可以⽀持不同的嵌套需求。</p><h2 id="h-multiasset" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">多资产(MultiAsset)</h2><p>资产是NFT的⼀种输出类型：通常是媒体⽂件。 资产可以是图像、电影、PDF⽂件，甚⾄是⻆⾊模型。多资源NFT是⼀种可以根据特定上下⽂信息输 出不同资源的NFT，例如，如果将PDF加载到PDF阅读器中，则加载PDF，⽽不是在Opensea中加 载图像。</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/f4b9a7951b7f806639e743b596e806201fd055dc4c88c065ecefd4943f0cd3b9.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><h2 id="h-equippable" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">可装备(Equippable)</h2><p>总算，当我们说到可装备性的时候，我们终于⼀步步⾛进了RMRK团队的内⼼深处（不是）。 Equippable是将我们前⾯说的多资产和可嵌套两个特性结合起来，并且加上了与装备特性有关接⼝之 后的新特性。它将前⾯说的两个特性结合起来，实现了更加多元，具有互操作性的玩法。</p><p>在对可装备性进⾏讲解前，希望⼤家能够不要被“装备”两个字局限，它最开始是需求确实是来 源于链游，但是后⾯的想象⼒完全不会只局限于链游。通过我的观察，很多技术都是最先应⽤在游戏 中，随后再被各⾏各业发扬光⼤。</p><p>NFT的可装备性抽象来看是包含两个⽅⾯的含义：</p><ol><li><p>不同的NFTCollection之间可以相互连接，互相包含。</p></li><li><p>装备了不同组件的NFT可以有多种展⽰⽅式。</p></li></ol><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/e325528bfcedcfa88e4f7508c92c1409bac3605989d6c7f1f95b8274413e27ef.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>如上图所⽰，这些是RMRK核⼼的乐⾼概念，通过功能的拼装，创造出新的功能与玩法。可装备性也不 例外，在最右边，有⼀个我们没有⻅过的新东西，叫做Base。我们⾸先就来讲讲Base是⼀个什么。</p><p>RMRK引⼊了Base的概念。⼀个Base可以被认为是⼀个零件⽬录，可以从中组成⼀个NFT。每 个零件被叫做part，part可以是 slot 类型或 fixed 类型，并且会。slot⽤于装备。⽽fixed表⽰直 接展⽰某个类型的资产（plainmultiasset）。通过图⽚的⽅式能够使⼤家⽐较容易理解Base和装备 是怎么关联的，因此我们在下⾯的解释中，将会使⽤不同的图⽚来介绍Base和装备是怎么起到对应的 作⽤的。在介绍前，⼤家需要建⽴⼀个共识就是：⽬前RMRK只会保存NFT之间的连接关系，不会保存 NFT的渲染⽅式，换句话说，⼀个装备了若⼲NFT的NFT该如何展⽰，RMRK只做了最基础的指引（⽐ 如图层zindex，装备位置等），⽽不会对实际渲染画⾯做强约束。这也正说明了RMRK的抽象性与通 ⽤性，体现了其中的分层思想，它只负责做基本的存储，但是怎么解释存储关系（通常来说就是渲 染），留给了渲染层。</p><p>举个例⼦，如果我想要给犀⽜戴上帽⼦，渲染层拿到的不会是新的图像地址，合约同样不会⽣成 新的静态图像来代替旧图像（which很多PFP项⽬⽅就是这样做的），⽽是将犀⽜NFT与帽⼦NFT的连 接关系与图像地址都给到渲染层，让渲染层⾃⾏渲染。</p><p>让我们以⼀个名为Chunkies的化⾝项⽬为例：胖乎乎的⻆⾊可以拿着物品，戴上头饰，并且具有 不同的背景，并且彼此之间看起来很独特。这⾥有⼀些组合。</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/2b1ba49ce7f04ca277b9e204a3b8251b56b6162c9bda9edcfbde5f4058c0d69a.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><h1 id="h-rmrk" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">RMRK的未来⾛向何⽅</h1><p>其实我个⼈是不经常去主观猜想⼀个技术后⾯会有什么应⽤场景的，因为现实往往⽐想象更加丰富。 但是RMRK本⾝是⼀个NFT的标准集，基础设施。那么对于⼀个基础架构⽽⾔，找到应⽤场景是⼗分重 要的，不然就如同闭⻔造⻋。幸好，在NFT应⽤与现实接轨的年代，RMRK的应⽤场景是⾮常丰富的， 我⾸先抛出⼀句暴论：RMRK会将NFT从⼀维带到⼆维世界。最后给出⼀些在我想象中⽐较直观，⽐较 贴近⽬前市场的应⽤场景，权当抛砖引⽟，希望⼤家能够在了解RMRK后，有更好的想法。</p><h2 id="h-gamefi" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Gamefi：</h2><p>• RMRK能使NFT的交互逻辑存在于链上，这能够⼤幅增强链游的去中⼼化程度，客⼾端只需读取统 ⼀的链上装备逻辑，⽆需也不应该再各⾃定义游戏内的装备组合逻辑</p><p>• 可进化能⼒并真正确保稀缺性：基于Multi-Asset能⼒，Axie可以在玩家不获得新阶段AxieNFT外观 空投的情况下，实现进化能⼒，相⽐空投模式是更符合直觉的形式，并因此确保了NFT的稀缺性</p><p>• 跨IP联动并真正确保稀缺性：Axie能够进⼊Otherside，或者BAYC能够进⼊Axie，但是⼀旦Axie处 在Otherside中，那么这只Axie就不应该还可以继续在Axie世界中游玩，因为链上状态显⽰⽬前Axie 处于Otherside世界中，这真正确保了NFT的稀缺性。</p><h2 id="h-did" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">DID：</h2><p>• 能够使链上贡献度更加聚合并增强社区参与积极性，声誉类NFT能够被归集到单个NFT上，不再分 散并可以更动态地展⽰个⼈荣誉（例：每个社区可以单独发⾏链上荣誉墙NFT给每位贡献者，所有 发⾏⾃该社区的声誉NFT将能够被发送到荣誉墙NFT，并能够被装备在荣誉墙上展⽰）</p><h2 id="h-avatar" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Avatar：</h2><p>• 可组合能⼒：ERC721中⻆⾊的装备将能够以单个NFT形式存在，并被装备到⻆⾊上，因此，NFT价 值可进⾏再分割，NFT外观复杂度将得到指数级增⻓，⼤幅提升藏家娱乐感，也因为各种新变量的 产⽣，NFT市场流动性将能够在原有Collection的规模下，直接再次得到⾄少线性级的放⼤。</p><p>• 跨IP联动：NFT项⽬⽅之间可以进⾏跨IP联动，⽤⼾将可以基于可组合能⼒，在⾃⼰的Avatar上⼀ 次展⽰多个知名NFT，以展⽰资深藏家⾝份。</p>]]></content:encoded>
            <author>boynn@newsletter.paragraph.com (Boyn)</author>
        </item>
        <item>
            <title><![CDATA[完整的Hardhat实践教程]]></title>
            <link>https://paragraph.com/@boynn/hardhat</link>
            <guid>uEXnncy2PhCDQBkYK9j1</guid>
            <pubDate>Sat, 22 Oct 2022 16:25:57 GMT</pubDate>
            <description><![CDATA[3個實用項目助您入門Hardhat是以太坊開發人員堆棧中最受歡迎的工具之一。 在本教程中，我們將學習如何使用 Hardhat 並了解其主要功能。 本教程將主要是動手操作； 我們將做以下項目： **項目 1：**對於第一個項目，主要目的是對 Hardhat 的工作原理有一個大致的了解。 我們將創建一個智能合約，對其進行測試，將其部署在 Rinkeby 上，並在 Etherscan 上進行驗證。 **項目 2：**對於第二個項目，我們將重新創建 Parity hack。 以太坊歷史上最大的黑客攻擊之一。 項目 3：最後，我們將通過在我們的機器內部運行 Hardhat 網絡來與合約和 EOA 進行交互。 完成這 3 個項目後，您應該對 Hardhat 在實際操作中的工作原理有一個很好的了解。 這是 3 個項目的 GitHub 存儲庫。先決條件為了遵循本教程，建議您具備以下知識：熟悉 Solidity熟悉以太坊（EVM）熟悉 JavaScript對區塊鏈基礎知識有很好的理解熟悉命令行熟悉單元測試在開始之前，我想對其他非常好的工具大喊大叫：Truffle Suite：使用 JavaScri...]]></description>
            <content:encoded><![CDATA[<h2 id="h-3" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">3個實用項目助您入門</h2><p>Hardhat是以太坊開發人員堆棧中最受歡迎的工具之一。 在本教程中，我們將學習如何使用 Hardhat 並了解其主要功能。 本教程將主要是動手操作； 我們將做以下項目：</p><p>**項目 1：**對於第一個項目，主要目的是對 Hardhat 的工作原理有一個大致的了解。 我們將創建一個智能合約，對其進行測試，將其部署在 Rinkeby 上，並在 Etherscan 上進行驗證。</p><p>**項目 2：**對於第二個項目，我們將重新創建 Parity hack。 以太坊歷史上最大的黑客攻擊之一。</p><p>項目 3：最後，我們將通過在我們的機器內部運行 Hardhat 網絡來與合約和 EOA 進行交互。</p><p>完成這 3 個項目後，您應該對 Hardhat 在實際操作中的工作原理有一個很好的了解。</p><p>這是 <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/rodrigoherrerai/hardhat-tutorial/tree/master">3 個項目的 GitHub 存儲庫</a>。</p><h2 id="h-" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">先決條件</h2><p>為了遵循本教程，建議您具備以下知識：</p><ul><li><p>熟悉 Solidity</p></li><li><p>熟悉以太坊（EVM）</p></li><li><p>熟悉 JavaScript</p></li><li><p>對區塊鏈基礎知識有很好的理解</p></li><li><p>熟悉命令行</p></li><li><p>熟悉單元測試</p></li></ul><p>在開始之前，我想對其他非常好的工具大喊大叫：</p><ul><li><p><strong>Truffle Suite</strong>：使用 JavaScript 構建，由 Consensys 開發。它是以太坊上最早的開發環境之一，你可以在這裡找到它。</p></li><li><p><strong>Brownie</strong>：如果你喜歡 Python，這就是你要走的路。你可以在這裡查看。Dapp 工具：這裡。</p></li><li><p><strong>Foundry</strong>：Paradigm 團隊用 Rust 重寫的 Dapp 工具，你可以在這裡找到它。</p></li></ul><p>開始吧！</p><h2 id="h-hardhat" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">什麼是Hardhat？</h2><p>Hardhat 是一個用於編譯、測試、部署和調試以太坊軟件的開發環境。它可以幫助開發人員管理和自動化構建智能合約和 dApp 過程中固有的重複性任務，並圍繞此工作流程輕鬆引入更多功能。這意味著在核心上編譯、運行和測試智能合約。</p><p>Hardhat 將幫助您完成整個智能合約開發之旅。從最初的創建、測試、交互和部署。它對於測試已經部署的合約和創建“未來假設”也非常有幫助。</p><p>在部署合約之前，您將在下面找到一個簡單的圖表，其中包含一個非常基本的開發人員工作流程：</p><p>Hardhat 是開發人員旅程中這些步驟的絕佳工具，它將與您一路同行。讓我們進一步解開它們：</p><p>**智能合約創建/測試：**這是您對合約進行編碼的步驟。通常你在編寫智能合約和測試代碼之間存在共生關係，這是因為你需要測試每一段代碼。 Hardhat 非常擅長這一點，因為它提供了非常好的插件來測試和優化代碼。</p><p>**部署：**在此步驟中，您將代碼（將solidity 或vyper 轉換）代碼編譯為字節碼，對其進行優化並進行部署。 Hardhat 有很多不錯的插件，我們稍後會看到它們非常有用。</p><p>此外，使用 Hardhat，您可以重現過去的場景。例如，您可以告訴 Hardhat 回到過去並像我們在“x”日期一樣重新進行黑客攻擊，或者您想做的任何其他事情。這是通過分叉主網來完成的。我們將在第二個項目中回顧這個特性。</p><p>如您所見，Hardhat 為我們提供了許多不錯的功能，可以在以太坊（或 EVM 兼容鏈）中發揮作用。</p><h2 id="h-hardhat" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Hardhat的架構</h2><p>Hardhat 是圍繞任務和插件的概念設計的。 Hardhat 的大部分功能來自插件，作為開發人員，您可以自由選擇要使用的插件。 Hardhat 對您最終使用的工具沒有意見，但它帶有一些可以覆蓋的內置默認值。</p><p>插件 → 插件是 Hardhat 的支柱，它們是使用您在 Hardhat 配置中使用的相同配置 DSL 構建的。您可以在此處找到 Hardhat 插件的完整列表。</p><p>任務 → 任務是帶有一些相關元數據的 JavaScript 異步函數。 Hardhat 使用此元數據為您自動執行某些操作。處理參數解析、驗證和幫助消息。您在 Hardhat 中可以做的所有事情都被定義為一項任務。</p><p>您可以將插件視為向基礎層添加額外功能的可重用代碼段。這樣做的好處是，您既可以自己創建插件，也可以使用任何社區和/或 Hardhat 的插件。</p><h2 id="h-hardhat" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Hardhat網絡</h2><p><em>Hardhat 內置了 Hardhat Network，這是一個專為開發而設計的本地以太坊網絡節點。</em></p><p>以太坊的核心是一套所有客戶都必須遵守的規範。以太坊協議（即客戶端）有不同的實現，最常用的是 GETH（用 GO 編寫）。但也有其他用不同語言編寫的。重要的是，它們都必須遵循以太坊的規範。</p><p>在底層，Hardhat 使用 EVM 的 JS 實現來運行您的文件。這意味著您正在您的機器上運行 Ethereum JS。這就是當您在內部發送交易、測試和部署合約時，Hardhat 知道該做什麼的方式。</p><h2 id="h-" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">項目結構</h2><p>您將在下面找到一個圖表，該圖表顯示了平均架構結構的外觀。 請記住，每個項目都是不同的，並且大小差異很大。 但這只是為了得到一個大致的了解。</p><p>simple-smart-contracts-project-structure</p><p>讓我們分析每個目錄：</p><p><code>contracts</code> → 在這裡，您將擁有所有合同和派生合同。 這意味著，您創建的所有合約、接口、庫和抽象合約都將位於 contracts 文件夾下。 唯一的例外是您通過 npm 包導入其他合約。</p><p><code>deployments</code> → 在部署下，您將擁有將合約部署到網絡的腳本。</p><p><code>test</code>→ 所有的測試用例都在這個文件夾下。 如圖所示，最好將每個合同文件的測試分開。</p><p><strong>hardhat.config.js</strong>→ Hardhat 的配置文件。</p><p>現在我們已經大致了解了 Hardhat 在理論上是如何工作的，讓我們從項目開始吧！</p><p>注意：我們將在 3 個項目中重複許多任務。 這樣做是為了增加練習。</p><h2 id="h-1" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">項目 1. 創建、測試、部署和驗證簡單代幣合約</h2><h2 id="h-" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">安裝和環境設置</h2><p>通過項目中的本地安裝使用硬帽。 這樣您的環境將是可重現的，並且您將避免未來的版本衝突。</p><p>你應該已經安裝了節點，你可以通過運行來檢查：</p><pre data-type="codeBlock" text="node -v
"><code>node <span class="hljs-operator">-</span>v
</code></pre><p>如果您沒有安裝它，您可以在此處查看安裝過程。對於整個教程，我們將在 hardhat-tutorial 中創建所有項目。 所以對於第一個項目，我們將創建一個名為 project1 的目錄並從那裡開始工作。</p><p>運行以下命令：</p><pre data-type="codeBlock" text="mkdir hardhat-tutorial
cd hardhat-tutorial
mkdir project1
cd project1
npm init -y
npm install --save-dev hardhat
"><code>mkdir hardhat<span class="hljs-operator">-</span>tutorial
cd hardhat<span class="hljs-operator">-</span>tutorial
mkdir project1
cd project1
npm init <span class="hljs-operator">-</span>y
npm install <span class="hljs-operator">-</span><span class="hljs-operator">-</span>save<span class="hljs-operator">-</span>dev hardhat
</code></pre><p>安裝hardhat後，運行以下命令：</p><pre data-type="codeBlock" text="npx hardhat
"><code></code></pre><p>您應該看到以下輸出：</p><p>選擇“創建一個空的 hardhat.config.js”選項。 這只會給我們一個空的安全帽配置文件，稍後我們將更詳細地查看它。</p><p>安裝完成後，安裝以下插件：</p><pre data-type="codeBlock" text="npm install --save-dev @nomiclabs/hardhat-ethers ethers @nomiclabs/hardhat-waffle ethereum-waffle chai
"><code>npm install <span class="hljs-operator">-</span><span class="hljs-operator">-</span>save<span class="hljs-operator">-</span>dev @nomiclabs<span class="hljs-operator">/</span>hardhat<span class="hljs-operator">-</span>ethers ethers @nomiclabs<span class="hljs-operator">/</span>hardhat<span class="hljs-operator">-</span>waffle ethereum<span class="hljs-operator">-</span>waffle chai
</code></pre><p>這些是hardhat最常用的插件之一，我們正在安裝 hardhat-ethers 和 hardhat-waffle。 Ethers 是一個與以太坊交互的庫，而 waffle 是一個測試智能合約的框架。</p><p>準備就緒後，打開您的 hardhat.config.js 文件並添加以下代碼：</p><p>hardhat.config.js</p><p>在這裡，我們只需要 hardhat-ethers 和 hardhat waffle，並告訴 hardhat 我們要使用 Solidity 的編譯器版本“0.8.8”。 稍後，我們將增加更多的複雜性並進入更多的細節。</p><p>一旦我們準備好基本配置，讓我們從有趣的部分開始。</p><p>對於第一個項目，我們將構建一個非常簡單的智能合約，對其進行測試，並將其部署在 Rinkeby 上。 這只是為了讓您初步了解創建、測試和部署合約的過程。</p><p>創建合同</p><p>我們需要做的第一件事是創建一個contracts目錄，如“simple-smart-contracts-project-structure”圖所示。</p><pre data-type="codeBlock" text="mkdir contracts
"><code>mkdir contracts
</code></pre><p>在合約內部，我們將創建一個名為 Token.sol 的文件。 請記住，最好將文件命名為與合同相同的名稱。</p><pre data-type="codeBlock" text="touch contracts/Token.sol
"><code>touch contracts<span class="hljs-operator">/</span>Token.sol
</code></pre><p>如果一切正確，你應該有這個文件夾結構：</p><p>在 Token 文件中，添加以下代碼：</p><p>這是一個非常簡單的代幣合約（不符合 ERC-20 標準），我們將所有初始供應提供給所有者。 同樣，這裡的目的是了解如何測試和部署合約。</p><h2 id="h-" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">測試合約</h2><p>準備好 Token.sol 後，創建一個測試文件夾。 在文件夾中，創建一個名為 token.js 的文件：</p><pre data-type="codeBlock" text="mkdir test
touch test/token.js
"><code><span class="hljs-built_in">mkdir</span> <span class="hljs-built_in">test</span>
<span class="hljs-built_in">touch</span> <span class="hljs-built_in">test</span>/token.js
</code></pre><p>這應該是您的文件結構：</p><p>在 token.js 文件中添加以下測試用例：</p><p>測試用例的描述應該是不言自明的。 但我們只是在測試 Token.sol 合約的基本功能。</p><p>準備就緒後，運行以下命令來測試該文件：</p><pre data-type="codeBlock" text="npx hardhat test
"><code>npx hardhat <span class="hljs-built_in">test</span>
</code></pre><p>如果一切順利，您應該會看到所有測試用例都通過了：</p><p>npx hardhat test 是 Hardhat 中的一項全局任務，它基本上是說，去查看一個名為 test 的文件夾並檢查測試用例。</p><p>請記住，如果您更改文件夾的名稱，除非您指定位置，否則它將不起作用：npx hardhat test 。 當項目變得更大時，指定確切的位置也非常有用。 這是因為您不想一直測試所有內容，這非常耗時。 對於我們的案例，我們還可以像這樣測試文件： npx hardhat test test/token.js
準備就緒後，讓我們在 Rinkeby 中部署合約。 部署合約 為了部署合約，我們首先需要對我們的配置文件進行一些更改。 在此之前，請安裝以下依賴項： npm install dotenv
Dotenv 是一個零依賴模塊，它將環境變量從 .env 文件加載到 process.env 中。 在將代碼推送到 GitHub 或其他地方時，我們將使用 dotenv 來保護我們的私鑰安全。 安裝 dotenv 後，創建 .env 文件並添加以下變量： 您只需要添加您的私鑰和與 Infura、alchemy 或您想使用的任何提供商的 URL 連接（確保該帳戶中有一些 rinkeby eth）。 注意：一定要選擇 Rinkeby 網絡。 準備就緒後，在 hardhat.config.js 中進行以下更改： hardhat.config.js 為了使用 dotenv，我們需要在頂層導入它 → require(“dotenv”).config();。
之後，我們可以創建變量並通過 → process.env.VARIABLE_NAME 獲取值。 將變量名全部大寫是一種很好的做法。 我們還修改了模塊，我們添加了關鍵字“networks”，這是為了指定 Hardhat，我們要在哪個網絡中部署我們的合約，例如 rinkeby、ropsten、mainnet 等……後面是 URL（節點連接）和帳戶（部署合約的私鑰）。準備就緒後，我們需要創建一個部署目錄，然後是一個 deployToken.js 文件： mkdir deployments
touch deployments/deployToken.js
在 deployToken.js 中添加以下代碼： 這是我們將用來部署我們的合約的腳本。 const initialSupply = ethers.utils.parseEther(“100000”); → 我們正在創建一個名為 initialSupply 的變量，其值為 100,000 * 10 ^18。 <strong>const [deployer] = await ethers.getSigners();</strong> → 這是合約的部署者，即 .env 文件中提供的私鑰的地址。 <strong>const tokenFactory = await ethers.getContractFactory(“Token”);</strong> → 合約的 Ethers 抽象，以便部署它。 **const contract = await tokenFactory.deploy(initialSupply);**→ 這行代碼使用 initialSupply 作為構造函數參數來部署合約。當然，如果您沒有構造函數參數，那麼您必須將其留空。同樣，如果您有更多構造函數參數，則需要在此處提供所有參數。 準備好後，我們將編譯合約。請記住，以太坊虛擬機不知道什麼是可靠性，它不理解它。它只理解字節碼，機器可讀的代碼。 執行： npx hardhat compile
您應該會看到兩個新目錄、artifacts和cache： ABI（application binary interface）和字節碼等所有相關信息都將位於 artifacts/contracts/CONTRACT_NAME/CONTRACT_NAME.json 下。 對於我們的案例：artifacts/contracts/Token.sol/Token.json 檢查里面的文件，ABI 基本上就是我們可以和合約交互的方式。它具有函數的所有規範，例如參數、狀態可變性和名稱。在文件的底部，您還將找到合約的字節碼。 現在是最終將合約部署到 Rinkeby 的時候了，為此，我們需要告訴 Hardhat 運行腳本：npx hardhat run — network 。 對於我們的例子，運行： npx hardhat run deployments/deployToken.js — network rinkeby
如果一切順利，您應該會看到已部署合約的地址。 驗證合同 在 Etherscan 上驗證合約很重要，這樣人們就可以看到源代碼，這增強了信任和安全性。它增強了信任，因為人們可以看到他們正在與之交互的協議的來源。還有安全性，因為會有更多的眼球，所以時間越長，潛在的黑客攻擊的可能性就越小。 轉到 <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://rinkeby.etherscan.io/">https://rinkeby.etherscan.io/</a> 並輸入剛剛部署的地址，然後單擊“合約”選項卡，您應該只看到字節碼： Harhdat 使用插件 hardhat-etherscan 簡化了驗證源的過程。 我們需要做的第一件事是安裝插件： npm install --save-dev @nomiclabs/hardhat-etherscan
安裝後，我們需要對配置文件進行一些調整： 為了驗證合約，您需要獲得一個 Etherscan api 密鑰。 擁有它後，請確保將其添加到 .env 文件中。 為了驗證合約，我們需要運行以下命令：<code>npx hardhat verify — network &lt;networkName&gt; &lt;contractAddress&gt; &lt;ConstructorArguments&gt;</code><strong>.</strong> npx hardhat verify --network rinkeby CONTRACT_ADDRESS &quot;100000000000000000000000&quot;
注意：將 CONTRACT_ADDRESS 替換為新創建的合約地址。 如果一切順利，它應該說“在 Etherscan 上成功驗證了合約 Token”。 如果我們現在看一下合約，我們應該會看到經過驗證的源代碼： 這就是第一個項目！ 項目 2. 重新創建 Parity 錢包黑客 奇偶校驗黑客是以太坊中一個非常大且重要的黑客攻擊。攻擊者竊取了超過 150000 ETH。 我們要做的是回到過去（或者如果可以的話，回到以太坊的區塊長度）並充當黑客來竊取資金。在繼續之前，重要的是要了解出了什麼問題。 多重簽名錢包非常適合存儲大量資金和/或減輕一方風險。通常它們的工作方式是擁有一組所有者和一個門檻。閾值是執行給定交易所需的最小簽名。 無需過多介紹，這裡有一個實現合約或具有所有錢包功能的“單例”，以及一個部署代理合約的代理工廠，該代理合約將所有調用委託給實現合約。因此，當您創建一個新錢包時，它具有唯一的地址和存儲空間，但會將所有調用委託給實現合約。 好的，那麼出了什麼問題？ 通常，當您擁有這種類型的架構時，您需要確保： 1）所有更改狀態的函數都受到保護（只有特定的一組人可以調用它們）。2) 設置合約的初始函數只能調用一次。 如果我們看到他們的<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/openethereum/parity-ethereum/blob/4d08e7b0aec46443bf26547b17d10cb302672835/js/src/contracts/snippets/enhanced-wallet.sol">代碼</a>，initWallet 函數是開放給每個人調用的。這意味著您可以直接調用該函數，將您的地址添加為所有者，並控制錢包。 所以，黑客在發現漏洞後第一時間做的，就是尋找 Eth 數量最多的錢包。 對於這個例子，我們將回到區塊 4043802 並從特定錢包中獲取 82189 Eth。 你可以在這裡看到真實的交易。 以下是交易的快照： 在繼續之前，我們需要了解 Hardhat 的一些不錯的功能，我們將使用這些功能重新創建 hack： **主網分叉：**您可以啟動一個分叉主網的 Hardhat Network 實例。這意味著它將模擬與主網相同的狀態，但它將作為本地開發網絡工作。這樣您就可以與已部署的協議進行交互並在本地測試複雜的交互。在分叉主網時，有一些非常好的功能： <strong>模擬帳戶→</strong>此功能使您可以像我們是給定帳戶的所有者一樣行事。對於我們的示例，我們將像黑客一樣行事。 <strong>固定塊→</strong> Hardhat 允許您指定塊號。這意味著鏈的狀態將就像我們在那個給定的塊中一樣。注意：要固定塊，您需要訪問存檔節點（Alchemy 提供此功能）。 對於我們的示例，我們將主要使用這些功能，但如果您想檢查所有這些功能，請轉到<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://hardhat.org/hardhat-network/guides/mainnet-forking.html#mainnet-forking">此處</a>。 讓我們繼續前進。 我們需要做的第一件事是建立我們的新項目。在 hardhat-tutorial 中，創建一個名為 project2 的新目錄。然後，讓我們進行基本設置。以下是命令，請務必在 hardhat-tutorial 中： mkdir project2
cd project2
npm init -y
npm install --save-dev hardhat
npx hardhat
選擇“創建一個空的 hardhat.config.js” 然後安裝一些hardhat插件和 dotenv ： npm install --save-dev @nomiclabs/hardhat-ethers ethers @nomiclabs/hardhat-waffle ethereum-waffle chai
npm install dotenv
對於這個項目，我們實際上不會編寫任何智能合約。 這是因為我們扮演著“黑客”的角色，所以我們從我們的外部賬戶發送交易。 如前所述，為了分叉主網，我們需要一個存檔節點。 Alchemy 提供了這樣的東西，所以獲取一個 Alchemy URL 並確保選擇 Mainnet。準備好後，創建一個 dotenv 文件並添加 URL： touch .env
然後在您的 hardhat.config.js 文件中添加以下代碼： hardhat.config.js 如您所見，語法非常簡單，我們只需要告訴 Hardhat 我們正在分叉鏈，提供一個存檔節點和一個區塊號。 不強制提供區塊號，如果不提供，安全帽會分叉到最新狀態。 下一步是創建我們的測試用例，我們將在其中實現所有邏輯（黑客攻擊）。 繼續運行以下命令： mkdir test
touch test/parityHack.js
在展示代碼之前，了解我們在做什麼非常重要。 我們要回到區塊號 4043801 → 實際的黑客攻擊是在區塊 4043802 中，但我們不能在那個區塊上這樣做，因為那是黑客耗盡所有資金的時候。 我們正在冒充黑客的賬號，地址如下：0xB3764761E297D6f121e79C32A65829Cd1dDb4D32 我們正在調用未受保護的 initWallet 函數，以便我們控制錢包。 這是錢包地址：0xBEc591De75b8699A3Ba52F073428822d0Bfc0D7e 我們正在將所有資金轉移到黑客的賬戶。 然後通過運行測試文件： npx hardhat test
輸出： 如您所見，我們成功耗盡了錢包的所有資金！ 項目 3. 使用Hardhat網絡 我們之前看到了安全帽網絡的快速定義。讓我們更深入一點： <em>Hardhat 內置了 Hardhat Network，這是一個專為開發而設計的本地以太坊網絡節點。它允許您部署合約、運行測試和調試代碼。</em> <em>它作為進程內或獨立守護程序運行，為 JSON-RPC 和 WebSocket 請求提供服務。默認情況下，它會在收到的每筆交易中按順序挖掘一個塊，並且沒有延遲。如前所述，它由 ethereumjs/vm 支持。</em> 此功能允許您使用外部擁有的帳戶，非常快速地部署智能合約並與之交互。 讓我們看看這是如何工作的。 注意：Hardhat 附帶 20 個確定性帳戶。確定性意味著 20 個帳戶對於使用 Hardhat 的每個人來說都是相同的。所有的私鑰都被洩露了。永遠不要向這些賬戶發送真實資金。它們僅用於測試目的。 首先，我們需要進行基本設置。使用所有基本配置創建一個名為 project3 的目錄： 確保位於根目錄中： mkdir project3
cd project3
npm init -y
npm install --save-dev hardhat
npm install --save-dev @nomiclabs/hardhat-ethers
npx hardhat
選擇“創建一個空的 hardhat.config.js”。 然後，讓我們創建一個名為“Hello”的合約。 這個簡單的合約將只有一個返回“hello”的函數（這裡的目的是演示如何與 Hardhat 網絡交互）。 繼續在contracts目錄下創建Hello.sol： mkdir contracts
touch contracts/Hello.sol
添加以下代碼，然後編譯合約： npx hardhat compile
然後我們準備將合約部署到hardhat網絡。 您應該記住，我們需要創建一個部署腳本： 在運行腳本之前，我們需要讓網絡運行。 運行： npx hardhat node
您應該會看到服務器在 <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="http://127.0.0.1:8545/">http://127.0.0.1:8545/</a> 運行，這將是我們的主要端點，還會看到 Hardhat 的 20 個確定性帳戶。 npx hardhat node 為了部署合約，您需要保持鏈運行，因此打開另一個終端並運行：npx hardhat run — network localhost npx hardhat run --network localhost deployments/deployHello.js
您應該在運行區塊鏈的終端中看到類似的輸出： 如您所見，通過在本地運行鏈，我們可以更“深入”地了解幕後發生的事情。 確保複製新合約的地址（它應該在另一個終端窗口上）。 準備就緒後，創建一個 main.js 文件： touch main.js
在這裡，我們將只進行簡單的操作，例如顯示余額、進行交易以及與我們的 Hello 合約進行交互。 玩弄文件，獨立調用每個函數以查看輸出。 要運行文件： node main.js
其他插件和任務 有很多非常好的插件、任務和功能。 不幸的是，我們無法涵蓋所有這些。 我將分享我認為最有用的以及我看到大型項目使用最多的那些： Console.sol：Hardhat 允許您在智能合約內部控制日誌，這對於調試非常有用。 為此，您只需要導入 hardhat/console.sol。 如果我們回到我們的 Token 示例，它看起來像這樣： 如果你看到了，我們正在記錄構造函數中的總供應量。 這是運行測試文件時的輸出： <strong>Typescript 集成</strong>：在開發大型項目時，通常希望使用強類型語言以減少錯誤。去<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://hardhat.org/guides/typescript.html">這裡</a>查看安裝要求。 <strong>驗證合約</strong>：正如我們在第一個示例中看到的，安全帽使驗證合約的源代碼變得非常簡單。如果你想深入挖掘，請到<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://hardhat.org/plugins/nomiclabs-hardhat-etherscan.html">這裡</a>。 <strong>主網分叉</strong>：正如我們之前在第二個示例中看到的，主網分叉對於與已部署的協議進行交互和模擬鏈的狀態非常有用。例如，如果你有一個與 Uniswap 交互的合約，你可以分叉鏈並模擬交易。如果你想更深入，去<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://hardhat.org/hardhat-network/guides/mainnet-forking.html">這裡</a>。 **測試：**測試是 Dapp 開發過程中最重要的步驟之一。 Hardhat 提供了很多不錯的插件來使測試更好。一個開箱即用的插件組合是 ethers.js 和 waffle。如果您想了解更多信息，請前往<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://hardhat.org/guides/waffle-testing.html">此處</a>。 Gas Reporter：這個插件告訴你每個單元測試的gas使用量。去<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.npmjs.com/package/hardhat-gas-reporter">這裡</a>了解更多詳情。 而已 ！</p>]]></content:encoded>
            <author>boynn@newsletter.paragraph.com (Boyn)</author>
        </item>
        <item>
            <title><![CDATA[我眼里的工程思维]]></title>
            <link>https://paragraph.com/@boynn/HHOVKUNpC1JAwPXCPxq5</link>
            <guid>HHOVKUNpC1JAwPXCPxq5</guid>
            <pubDate>Sun, 12 Jun 2022 06:12:54 GMT</pubDate>
            <description><![CDATA[最近在项目组里面遇到了三件小事，让我重新审视了一下，到底什么是工程思维，工程思维在工作中是怎么发挥作用的。 先说说这三件小事，第一件是一位小伙伴在域名迁移的时候，需要更改服务请求的path。理应来说，如果有调用方在请求这些接口，如果需要进行域名迁移的话，当然是先要对老的路径进行兼容的，但是这位小伙伴觉得既然都在测试阶段就可以直接迁移了，而且服务上线也可以同步改动，不用先兼容后删除。先不说这种想法是不是正确的，单论不做兼容而言，这就很不工程思维，没有站在业务方调用的角度来看这件事。 第二件事是另外一位小伙伴给我们介绍他们的系统，其中登陆模块是他们自己做的，这当然有着产品和技术上面的权衡，本身没有什么毛病。但是在登陆模块中，账户名和密码居然是明文传输和明文存储的，这就不禁让人感觉到十分地疑惑了，我们需要为了时间做到这么极致的简单吗？这个临时方案确实是十分临时了。在这里我看到的是他虽然可以在很短的时间内做出一个完成PM需求的系统，但是后续的安全性和可维护性可能在工程上都很难评估。 第三件事是还有一位前端的小伙伴，在测试的时候，QA同学指出了其中有一些地方跟设计稿不同，或者交互上面不合理...]]></description>
            <content:encoded><![CDATA[<p>最近在项目组里面遇到了三件小事，让我重新审视了一下，到底什么是工程思维，工程思维在工作中是怎么发挥作用的。</p><p>先说说这三件小事，第一件是一位小伙伴在域名迁移的时候，需要更改服务请求的path。理应来说，如果有调用方在请求这些接口，如果需要进行域名迁移的话，当然是先要对老的路径进行兼容的，但是这位小伙伴觉得既然都在测试阶段就可以直接迁移了，而且服务上线也可以同步改动，不用先兼容后删除。先不说这种想法是不是正确的，单论不做兼容而言，这就很不工程思维，没有站在业务方调用的角度来看这件事。</p><p>第二件事是另外一位小伙伴给我们介绍他们的系统，其中登陆模块是他们自己做的，这当然有着产品和技术上面的权衡，本身没有什么毛病。但是在登陆模块中，账户名和密码居然是明文传输和明文存储的，这就不禁让人感觉到十分地疑惑了，我们需要为了时间做到这么极致的简单吗？这个临时方案确实是十分临时了。在这里我看到的是他虽然可以在很短的时间内做出一个完成PM需求的系统，但是后续的安全性和可维护性可能在工程上都很难评估。</p><p>第三件事是还有一位前端的小伙伴，在测试的时候，QA同学指出了其中有一些地方跟设计稿不同，或者交互上面不合理的地方。这位小伙伴直接把错误甩给了UI同学，并且在PM指出UI同学没有错误之后，仍会有其他辩解的地方。并且后续在测试途中，还有许多其他的BUG。</p><p>可以看出来，这三位小伙伴其实基本能力都不差，并且老实说还挺好的，也不存在很笨，理解不了的情况。但是在合作者的眼里看来，总是欠缺了一点思维，会让别人觉得合作起来比较费劲，在这里，我总结了几点工程思维中需要达到的：</p><ol><li><p>保持对线上的敬畏之心。上线前请检查自己的代码，先通过自己的测试之后再上线。</p></li><li><p>保持对合作者的同理心。合作者同样也是人，有时候需要多一点换位思考的能力，想想自己所做的东西在合作方的看法，怎么样更加顺畅地合作。</p></li><li><p>保持对同事的谦虚之心。兼听则明。</p></li><li><p>保持对技术的进取之心。好好打磨自己的专业能力。</p></li></ol>]]></content:encoded>
            <author>boynn@newsletter.paragraph.com (Boyn)</author>
        </item>
    </channel>
</rss>