<?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>01Coder</title>
        <link>https://paragraph.com/@01coder</link>
        <description>undefined</description>
        <lastBuildDate>Thu, 27 Aug 2026 23:32:22 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <image>
            <title>01Coder</title>
            <url>https://storage.googleapis.com/papyrus_images/a947046aebcc4f614170b0e4938e540844d9467466c792d42c6b08d906c10767.jpg</url>
            <link>https://paragraph.com/@01coder</link>
        </image>
        <copyright>All rights reserved</copyright>
        <item>
            <title><![CDATA[什么是上海升级？]]></title>
            <link>https://paragraph.com/@01coder/jIIezcmo574zhmyWhLhr</link>
            <guid>jIIezcmo574zhmyWhLhr</guid>
            <pubDate>Thu, 30 Mar 2023 22:55:46 GMT</pubDate>
            <description><![CDATA[上海升级（Ethereum Shanghai Upgrade）是以太坊区块链的一个升级版本，它是以太坊网络的第二个重大升级，也是自以太坊伦敦升级以来的最新升级。 该升级旨在改进以太坊网络的安全性、可扩展性和用户体验，其中包括以下主要更新：EIP-3198：增强以太坊网络的安全性和抗 DDOS 攻击能力。EIP-3529：优化以太坊网络的燃料费用（gas fees）和燃料费用调整算法。EIP-3541：限制以太坊智能合约中某些旧的自毁（self-destruct）机制，以减少智能合约被误操作的风险。EIP-3554：将以太坊区块的挖掘奖励从 2 ETH 降低到 1 ETH，以控制以太坊通胀率。EIP-1559（在伦敦升级中引入）的改进：增加燃料费用上限，限制过高的燃料费用，提高交易确认速度。EIP-3198EIP-3198是以太坊上海升级中的一个改进提案，旨在增强以太坊网络的安全性和抗 DDOS 攻击能力。 DDOS攻击是一种常见的网络攻击方式，攻击者通过向网络发送大量无效的请求或数据包，导致网络服务不可用或崩溃。以太坊网络也面临着 DDOS 攻击的风险，因为攻击者可以通过发送大量...]]></description>
            <content:encoded><![CDATA[<p><strong>上海升级</strong>（Ethereum Shanghai Upgrade）是以太坊区块链的一个升级版本，它是以太坊网络的第二个重大升级，也是自以太坊伦敦升级以来的最新升级。</p><p>该升级旨在改进以太坊网络的安全性、可扩展性和用户体验，其中包括以下主要更新：</p><ol><li><p><strong>EIP-3198</strong>：增强以太坊网络的安全性和抗 DDOS 攻击能力。</p></li><li><p><strong>EIP-3529</strong>：优化以太坊网络的燃料费用（gas fees）和燃料费用调整算法。</p></li><li><p><strong>EIP-3541</strong>：限制以太坊智能合约中某些旧的自毁（self-destruct）机制，以减少智能合约被误操作的风险。</p></li><li><p><strong>EIP-3554</strong>：将以太坊区块的挖掘奖励从 2 ETH 降低到 1 ETH，以控制以太坊通胀率。</p></li><li><p><strong>EIP-1559</strong>（在伦敦升级中引入）的改进：增加燃料费用上限，限制过高的燃料费用，提高交易确认速度。</p></li></ol><h2 id="h-eip-3198" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">EIP-3198</h2><p>EIP-3198是以太坊上海升级中的一个改进提案，旨在增强以太坊网络的安全性和抗 DDOS 攻击能力。</p><p>DDOS攻击是一种常见的网络攻击方式，攻击者通过向网络发送大量无效的请求或数据包，导致网络服务不可用或崩溃。以太坊网络也面临着 DDOS 攻击的风险，因为攻击者可以通过发送大量的无效交易请求来拥塞网络。</p><p>EIP-3198的主要目标是改进以太坊网络的流量管理机制，从而提高网络的抗 DDOS 攻击能力。具体来说，EIP-3198包括以下两个主要改进：</p><ul><li><p>动态调整燃料费用上限</p></li></ul><p>以太坊网络中的每笔交易都需要支付一定的燃料费用（gas fees），以激励矿工验证和打包交易。这些燃料费用的上限通常是固定的，而EIP-3198将引入一种动态调整燃料费用上限的机制，以根据当前网络状况自动调整燃料费用上限。这样做可以确保网络的可用性和稳定性，同时也可以有效地减少 DDOS 攻击的风险。</p><ul><li><p>引入流量管理机制</p></li></ul><p>EIP-3198还引入了一种流量管理机制，即通过限制每个 IP 地址的请求速率来控制网络的流量。具体来说，EIP-3198将引入一种名为“时间窗口（time window）”的机制，通过监视每个 IP 地址的请求速率来限制它们的请求速率。这样做可以有效地防止网络被大量的无效请求拥塞，提高网络的可用性和抗 DDOS 攻击能力。</p><h2 id="h-eip-3529" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">EIP-3529</h2><p>EIP-3529是以太坊上海升级中的一个改进提案，旨在优化以太坊网络的燃料费用（gas fees）和燃料费用调整算法。</p><p>在以太坊网络中，每笔交易都需要支付一定数量的燃料费用，以激励矿工验证和打包交易。燃料费用是以太坊网络中的核心机制，也是使得网络能够安全、稳定、高效运行的关键。然而，当前的燃料费用机制存在一些问题，如过高的燃料费用、燃料费用波动过大等，这些问题都需要得到解决。</p><p>EIP-3529的主要目标是优化以太坊网络的燃料费用机制，从而减少用户支付的燃料费用，并使网络更加高效和稳定。具体来说，EIP-3529包括以下两个主要改进：</p><ul><li><p>静态燃料费用上限的优化</p></li></ul><p>当前，以太坊网络中每个区块的燃料费用上限是固定的，而EIP-3529将引入一种新的静态燃料费用上限调整算法。这个算法会根据以太坊网络上的实际交易情况来动态地调整每个区块的燃料费用上限，从而使得整个网络更加高效和稳定。</p><ul><li><p>燃料费用调整算法的改进</p></li></ul><p>EIP-3529还对燃料费用调整算法进行了改进，以减少燃料费用的波动性。具体来说，EIP-3529将引入一种名为“Per-transaction pricing”的算法，即每个交易的燃料费用将由网络自动计算，而不是由用户手动设置。这种算法可以使得交易的燃料费用更加准确和公平，并且减少了燃料费用的波动性。</p><h2 id="h-eip-3541" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">EIP-3541</h2><p>EIP-3541是以太坊上海升级中的一个改进提案，旨在增强以太坊智能合约的可读性和可维护性。</p><p>在以太坊智能合约的开发过程中，开发者需要经常处理内存管理和堆栈操作，这对于一些开发者来说可能会比较困难。同时，内存管理和堆栈操作也可能会导致智能合约代码的可读性和可维护性下降。</p><p>EIP-3541的主要目标是通过引入新的智能合约指令来解决这些问题。具体来说，EIP-3541包括以下两个主要改进：</p><ul><li><p>新的智能合约指令</p></li></ul><p>EIP-3541将引入新的智能合约指令，包括RETURNDATASIZE、RETURNDATACOPY、STATICCALL、REVERT、INVALID、SELFDESTRUCT、CALLCODE等，这些指令将有助于简化内存管理和堆栈操作，并提高智能合约代码的可读性和可维护性。</p><ul><li><p>合约创建的改进</p></li></ul><p>当前，在以太坊网络中，合约的创建需要花费相对较高的燃料费用，并且还需要访问一个全局的合约计数器来生成新的合约地址。这可能会导致一些性能和安全问题。</p><p>EIP-3541将引入一个新的合约地址生成机制，使得合约地址的生成更加高效和安全。具体来说，新的机制将使用新的智能合约指令CREATE2来代替现有的合约创建机制，从而避免了访问全局计数器的需求，同时也可以减少燃料费用。</p><h2 id="h-eip-3554" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">EIP-3554</h2><p>EIP-3554是以太坊的一个提案，它旨在延长以太坊1.0主网的生命周期，为其提供更长期的支持和维护。具体来说，EIP-3554建议对以太坊的挖矿奖励机制进行调整，以确保矿工在以太坊主网升级后仍然有足够的激励来维护网络。</p><p>当前，以太坊的挖矿奖励机制是基于区块高度的固定奖励，即每挖出一个区块，矿工将获得一定数量的以太币作为奖励。随着时间的推移，这个固定奖励会逐渐减少，因此矿工需要依靠交易费用来获取更多的奖励。然而，随着以太坊1.0主网的生命周期逐渐接近，这种挖矿奖励机制将不再适用，因为交易费用可能不足以支撑矿工的运营成本。</p><p>为了解决这个问题，EIP-3554提出了一个新的挖矿奖励机制，即在以太坊1.0主网到期之后，每个新区块的奖励将会有一个固定的最低值，这将确保矿工始终有足够的激励来维护网络。与此同时，随着时间的推移，每个新区块的奖励将逐渐降低，直到最终达到零。</p><p>具体来说，EIP-3554建议在以太坊1.0主网到期后，在第13,000,000个区块之后，每个新区块的奖励将会有一个固定的最低值，即0.0005以太币。然后，每隔2048个区块，这个最低值将减半，直到最终降至0。</p><p>EIP-3554是为了确保以太坊主网的长期稳定性和可持续性而提出的一个重要提案，它将为以太坊的生态系统提供更长期的支持和维护。</p><h2 id="h-eip-1559" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">EIP-1559</h2><p>EIP-1559是以太坊上海升级中的一个重要提案，旨在改进以太坊的交易费用机制。当前，以太坊的交易费用是由用户根据网络拥堵程度自主设置的，这导致了一些问题，例如交易费用高昂、不稳定、易受操纵等。</p><p>EIP-1559的主要目标是通过改进交易费用机制来解决这些问题。具体来说，EIP-1559包括以下三个主要方面的改进：</p><ul><li><p>基础交易费用</p></li></ul><p>EIP-1559将引入一个基础交易费用（base fee），这是一个动态的费用，会根据网络拥堵程度自动调整。每个区块的基础交易费用将由网络自动计算，并在交易中明确显示。</p><ul><li><p>最大交易费用</p></li></ul><p>在当前的交易费用机制中，用户需要自己设置交易费用，这可能会导致一些交易费用过高或过低。EIP-1559将引入一个最大交易费用（max fee），这将限制交易费用的最高值，从而保护用户不被过度收费。</p><ul><li><p>燃料费用</p></li></ul><p>EIP-1559还将改变燃料费用的结构。当前，以太坊的燃料费用是由燃料价格和燃料限制两个参数组成，这使得交易费用计算变得复杂。EIP-1559将引入一个新的燃料费用结构，只有燃料限制会影响燃料费用，而燃料价格将被废除。</p><p>希望这些文字能对同学们有所帮助🧑‍🎓</p>]]></content:encoded>
            <author>01coder@newsletter.paragraph.com (01Coder)</author>
            <enclosure url="https://storage.googleapis.com/papyrus_images/9bdbb7e2ba964047848aec24912b4da32ef10e38e36d9de4ba6d64035e2c9ace.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[什么是抽象账户？抽象账户如何应用于去中心化交易所？]]></title>
            <link>https://paragraph.com/@01coder/3IsRI3sCYWt1jnpiKZyJ</link>
            <guid>3IsRI3sCYWt1jnpiKZyJ</guid>
            <pubDate>Fri, 24 Mar 2023 00:06:30 GMT</pubDate>
            <description><![CDATA[账户抽象（Account Abstraction）是区块链技术中的一种概念，它指的是将智能合约与底层区块链账户的关系解耦，从而使智能合约可以在不考虑底层账户的情况下独立运行。具体来说，账户抽象模型使得智能合约能够将它们的状态保存在自己的存储器中，而不是依赖于底层账户的存储器。这样，智能合约就可以更加灵活地实现各种应用逻辑，而不受底层账户结构的限制。 StarkNet 是一个新型的 Layer 2 扩容方案，它在以太坊上运行，旨在实现高吞吐量、低费用和隐私保护等目标。StarkNet 的账户抽象模型建立在账户抽象的基础上，通过引入一些新的概念和机制，进一步提升了智能合约的灵活性和性能。 StarkNet 的账户抽象模型包含三个核心概念： 应用合约（Application Contracts）：应用合约是智能合约的一种，它通过 StarkNet 协议与底层区块链交互。应用合约可以读写存储器、调用其他合约，以及处理来自用户的交易请求。 世界状态（World State）：世界状态是智能合约的状态，它包含所有合约的存储器和区块链的账户状态。世界状态的更新是通过执行交易来完成的。 隐式账户...]]></description>
            <content:encoded><![CDATA[<p><strong>账户抽象</strong>（Account Abstraction）是区块链技术中的一种概念，它指的是将智能合约与底层区块链账户的关系解耦，从而使智能合约可以在不考虑底层账户的情况下独立运行。具体来说，账户抽象模型使得智能合约能够将它们的状态保存在自己的存储器中，而不是依赖于底层账户的存储器。这样，智能合约就可以更加灵活地实现各种应用逻辑，而不受底层账户结构的限制。</p><p>StarkNet 是一个新型的 Layer 2 扩容方案，它在以太坊上运行，旨在实现高吞吐量、低费用和隐私保护等目标。StarkNet 的账户抽象模型建立在账户抽象的基础上，通过引入一些新的概念和机制，进一步提升了智能合约的灵活性和性能。</p><p>StarkNet 的账户抽象模型包含三个核心概念：</p><p><strong>应用合约</strong>（Application Contracts）：应用合约是智能合约的一种，它通过 StarkNet 协议与底层区块链交互。应用合约可以读写存储器、调用其他合约，以及处理来自用户的交易请求。</p><p><strong>世界状态</strong>（World State）：世界状态是智能合约的状态，它包含所有合约的存储器和区块链的账户状态。世界状态的更新是通过执行交易来完成的。</p><p><strong>隐式账户</strong>（Implicit Accounts）：隐式账户是一种特殊的账户，它与应用合约紧密关联。每个应用合约都有一个唯一的隐式账户，该账户由 StarkNet 负责维护和管理。隐式账户没有私钥和地址，只能通过应用合约来访问和操作。</p><p>在 StarkNet 的账户抽象模型中，智能合约的状态保存在世界状态中，每个应用合约都有一个隐式账户与之对应。这种模型不仅能够提高智能合约的灵活性和可扩展性，还能够减少底层区块链的负担，从而提高整个系统的性能和吞吐量。</p><p>普通用户通常无需直接使用账户抽象，因为它是一种底层的技术概念，主要是为区块链开发者提供更灵活的智能合约编程方式和更高效的区块链应用部署方式。</p><p>不过，普通用户可以通过使用基于账户抽象的智能合约来体验更丰富的区块链应用，例如去中心化交易所、数字资产交易、投票系统等。这些应用通常会使用账户抽象来实现更高效的合约执行和更灵活的状态管理。</p><p>此外，普通用户也可以通过使用支持账户抽象的钱包来管理自己的数字资产和交易。这些钱包通常会提供更友好的用户界面和更方便的操作方式，以帮助用户更加轻松地使用区块链服务。</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/114356a2dca4ac1993b793446e31e2579b5fe491361d2ce53287abc57854bea0.jpg" 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>去中心化交易所</strong>（Decentralized Exchange，简称 DEX）是一种基于区块链技术的交易平台，它通过智能合约来实现交易、结算和资产管理等功能，同时不依赖于中心化机构来托管用户资产。去中心化交易所通常会使用账户抽象来实现更高效的合约执行和更灵活的状态管理。</p><p>在一个去中心化交易所中，通常会使用账户抽象来管理交易对的流动性和资金池。当用户想要交易某种数字资产时，他们可以将自己的资产存入交易对的资金池中，然后通过智能合约来实现交易。</p><p>具体来说，当用户将资产存入资金池时，它们会被存入一个特殊的隐式账户中，该账户与该交易对的智能合约相关联。这样，智能合约就可以访问和管理这些资产，同时确保交易的公正性和安全性。</p><p>当用户想要进行交易时，智能合约会根据当前的资金池情况来计算交易价格，并将交易结果保存在另一个隐式账户中。一旦交易完成，资金池中的资产也会相应地更新，以反映新的交易情况。</p><p>通过使用账户抽象，去中心化交易所能够实现更高效的交易和更灵活的资产管理，同时不依赖于中心化机构来托管用户资产。这样，用户就可以更加自由地管理自己的资产和参与到去中心化交易市场中。</p><p>以下是一个简单的 <strong>Solidity</strong> 智能合约示例，演示了基于账户抽象的用户交易场景。</p><p>假设有一个交易对，其中用户可以交易代币 A 和代币 B。该交易对的智能合约中包含两个隐式账户：一个用于存储代币 A，一个用于存储代币 B。用户可以通过向这两个账户中存入代币来参与交易，同时可以通过调用合约中的交易函数来进行交易。</p><pre data-type="codeBlock" text="pragma solidity &gt;=0.8.0 &lt;0.9.0;

contract MyExchange {
    mapping (address =&gt; uint256) private _balancesA;
    mapping (address =&gt; uint256) private _balancesB;
    
    function depositA(uint256 amount) public {
        _balancesA[msg.sender] += amount;
        // 将A的代币转账到交易所合约地址
        // ...
    }
    
    function depositB(uint256 amount) public {
        _balancesB[msg.sender] += amount;
        // 将B的代币转账到交易所合约地址
        // ...
    }
    
    function tradeAtoB(uint256 amount) public {
        uint256 price = getABPrice(amount);
        require(_balancesA[msg.sender] &gt;= amount, &quot;Insufficient balance&quot;);
        _balancesA[msg.sender] -= amount;
        _balancesB[msg.sender] += price;
        // 在交易所合约更新A和B代币余额
        // ...
    }
    
    function tradeBtoA(uint256 amount) public {
        uint256 price = getBAPrice(amount);
        require(_balancesB[msg.sender] &gt;= amount, &quot;Insufficient balance&quot;);
        _balancesB[msg.sender] -= amount;
        _balancesA[msg.sender] += price;
        // 在交易所合约更新A和B代币余额
        // ...
    }
    
    function getABPrice(uint256 amount) public view returns (uint256) {
        // 计算A基于B的价格
        // ...
    }
    
    function getBAPrice(uint256 amount) public view returns (uint256) {
        // 计算B基于A的价格
        // ...
    }
}
"><code><span class="hljs-meta"><span class="hljs-keyword">pragma</span> <span class="hljs-keyword">solidity</span> >=0.8.0 &#x3C;0.9.0;</span>

<span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">MyExchange</span> </span>{
    <span class="hljs-keyword">mapping</span> (<span class="hljs-keyword">address</span> <span class="hljs-operator">=</span><span class="hljs-operator">></span> <span class="hljs-keyword">uint256</span>) <span class="hljs-keyword">private</span> _balancesA;
    <span class="hljs-keyword">mapping</span> (<span class="hljs-keyword">address</span> <span class="hljs-operator">=</span><span class="hljs-operator">></span> <span class="hljs-keyword">uint256</span>) <span class="hljs-keyword">private</span> _balancesB;
    
    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">depositA</span>(<span class="hljs-params"><span class="hljs-keyword">uint256</span> amount</span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> </span>{
        _balancesA[<span class="hljs-built_in">msg</span>.<span class="hljs-built_in">sender</span>] <span class="hljs-operator">+</span><span class="hljs-operator">=</span> amount;
        <span class="hljs-comment">// 将A的代币转账到交易所合约地址</span>
        <span class="hljs-comment">// ...</span>
    }
    
    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">depositB</span>(<span class="hljs-params"><span class="hljs-keyword">uint256</span> amount</span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> </span>{
        _balancesB[<span class="hljs-built_in">msg</span>.<span class="hljs-built_in">sender</span>] <span class="hljs-operator">+</span><span class="hljs-operator">=</span> amount;
        <span class="hljs-comment">// 将B的代币转账到交易所合约地址</span>
        <span class="hljs-comment">// ...</span>
    }
    
    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">tradeAtoB</span>(<span class="hljs-params"><span class="hljs-keyword">uint256</span> amount</span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> </span>{
        <span class="hljs-keyword">uint256</span> price <span class="hljs-operator">=</span> getABPrice(amount);
        <span class="hljs-built_in">require</span>(_balancesA[<span class="hljs-built_in">msg</span>.<span class="hljs-built_in">sender</span>] <span class="hljs-operator">></span><span class="hljs-operator">=</span> amount, <span class="hljs-string">"Insufficient balance"</span>);
        _balancesA[<span class="hljs-built_in">msg</span>.<span class="hljs-built_in">sender</span>] <span class="hljs-operator">-</span><span class="hljs-operator">=</span> amount;
        _balancesB[<span class="hljs-built_in">msg</span>.<span class="hljs-built_in">sender</span>] <span class="hljs-operator">+</span><span class="hljs-operator">=</span> price;
        <span class="hljs-comment">// 在交易所合约更新A和B代币余额</span>
        <span class="hljs-comment">// ...</span>
    }
    
    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">tradeBtoA</span>(<span class="hljs-params"><span class="hljs-keyword">uint256</span> amount</span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> </span>{
        <span class="hljs-keyword">uint256</span> price <span class="hljs-operator">=</span> getBAPrice(amount);
        <span class="hljs-built_in">require</span>(_balancesB[<span class="hljs-built_in">msg</span>.<span class="hljs-built_in">sender</span>] <span class="hljs-operator">></span><span class="hljs-operator">=</span> amount, <span class="hljs-string">"Insufficient balance"</span>);
        _balancesB[<span class="hljs-built_in">msg</span>.<span class="hljs-built_in">sender</span>] <span class="hljs-operator">-</span><span class="hljs-operator">=</span> amount;
        _balancesA[<span class="hljs-built_in">msg</span>.<span class="hljs-built_in">sender</span>] <span class="hljs-operator">+</span><span class="hljs-operator">=</span> price;
        <span class="hljs-comment">// 在交易所合约更新A和B代币余额</span>
        <span class="hljs-comment">// ...</span>
    }
    
    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">getABPrice</span>(<span class="hljs-params"><span class="hljs-keyword">uint256</span> amount</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">uint256</span></span>) </span>{
        <span class="hljs-comment">// 计算A基于B的价格</span>
        <span class="hljs-comment">// ...</span>
    }
    
    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">getBAPrice</span>(<span class="hljs-params"><span class="hljs-keyword">uint256</span> amount</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">uint256</span></span>) </span>{
        <span class="hljs-comment">// 计算B基于A的价格</span>
        <span class="hljs-comment">// ...</span>
    }
}
</code></pre><p>在上述智能合约中，depositA 和 depositB 函数用于向交易对的 A 和 B 账户中存入代币，tradeAtoB 和 tradeBtoA 函数用于实现 A 到 B 和 B 到 A 的代币交易，getABPrice 和 getBAPrice 函数用于计算交易价格。</p><p>用户可以通过向这些函数传递相应的参数来参与交易。例如，要将 10 个代币 A 交换为代币 B，用户可以先调用 depositA 函数将代币 A 存入 A 账户中，然后调用 tradeAtoB 函数来进行交易。在交易完成后，用户的代币 B 余额将相应地增加，并且代币 A 余额将减少。</p><p>入门Starknet与AA，请戳下面视频。</p><div data-type="youtube" videoId="GcccIKkILDE">
      <div class="youtube-player" data-id="GcccIKkILDE" style="background-image: url('https://i.ytimg.com/vi/GcccIKkILDE/hqdefault.jpg'); background-size: cover; background-position: center">
        <a href="https://www.youtube.com/watch?v=GcccIKkILDE">
          <img src="{{DOMAIN}}/editor/youtube/play.png" class="play"/>
        </a>
      </div></div>]]></content:encoded>
            <author>01coder@newsletter.paragraph.com (01Coder)</author>
            <enclosure url="https://storage.googleapis.com/papyrus_images/febd607dab8f6e435ff7071ce6f1b178fa74e3167aa351275a4ed25d564045f7.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[识别ERC721合约]]></title>
            <link>https://paragraph.com/@01coder/erc721</link>
            <guid>TMFbTfwRDf8mq1ltOrNp</guid>
            <pubDate>Sun, 26 Feb 2023 23:21:24 GMT</pubDate>
            <description><![CDATA[导读最近在学习WTF学院的Ethers入门系列课程。 这是我对第12课 - 【识别ERC721合约】的学习建议。课程链接如下： https://wtf.academy/ether-start/ERC721Check/ 虽然课程内容不长，实例代码也非常精简直白，但其中依然有几个知识点是在我的学习过程中，在脑海中产生了碰撞的。故整理本文，希望Web3的Buidler有帮助。课前准备识别ERC721合约的前提是对ERC721和ERC165标准的理解。因此我们需要提前完成以下课程。ERC721https://wtf.academy/solidity-application/ERC721/ 这是WTF学院Solidity应用系列的课程之一。其中对ERC721和ERC165标准做了详细介绍。 该课程的学习我也做了视频分享，发布在了Youtube和B站上，链接分别为： https://www.bilibili.com/video/BV1aT41197Mx/ 对于倾向于通过视频进行学习的同学，请参考以上视频。ERC165规范对接口标识的定义在通过ERC165来识别ERC721标准时，会用到接口I...]]></description>
            <content:encoded><![CDATA[<h2 id="h-" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">导读</h2><p>最近在学习WTF学院的<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://wtf.academy/ether-start/">Ethers入门</a>系列课程。</p><p>这是我对第12课 - 【识别ERC721合约】的学习建议。课程链接如下：</p><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://wtf.academy/ether-start/ERC721Check/">https://wtf.academy/ether-start/ERC721Check/</a></p><p>虽然课程内容不长，实例代码也非常精简直白，但其中依然有几个知识点是在我的学习过程中，在脑海中产生了碰撞的。故整理本文，希望Web3的Buidler有帮助。</p><h2 id="h-" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">课前准备</h2><p>识别ERC721合约的前提是对ERC721和ERC165标准的理解。因此我们需要提前完成以下课程。</p><h3 id="h-erc721" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">ERC721</h3><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://wtf.academy/solidity-application/ERC721/">https://wtf.academy/solidity-application/ERC721/</a></p><p>这是WTF学院<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://wtf.academy/solidity-application">Solidity应用系列</a>的课程之一。其中对ERC721和ERC165标准做了详细介绍。</p><p>该课程的学习我也做了视频分享，发布在了Youtube和B站上，链接分别为：</p><div data-type="youtube" videoId="fmjNdM4DhDU">
      <div class="youtube-player" data-id="fmjNdM4DhDU" style="background-image: url('https://i.ytimg.com/vi/fmjNdM4DhDU/hqdefault.jpg'); background-size: cover; background-position: center">
        <a href="https://www.youtube.com/watch?v=fmjNdM4DhDU">
          <img src="{{DOMAIN}}/editor/youtube/play.png" class="play"/>
        </a>
      </div></div><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.bilibili.com/video/BV1aT41197Mx/">https://www.bilibili.com/video/BV1aT41197Mx/</a></p><p>对于倾向于通过视频进行学习的同学，请参考以上视频。</p><h3 id="h-erc165" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">ERC165规范对接口标识的定义</h3><p>在通过ERC165来识别ERC721标准时，会用到接口ID，也就是interface ID。因此，在学习如何识别时，需要对接口ID的标识机制有所了解。官方文档自然是最佳的信息源。请参考以下以太坊的EIP165官方文档的相关章节学习接口标识机制。</p><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified">https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified</a></p><p>该文档提到：</p><blockquote><p>For this standard, an <em>interface</em> is a set of <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://solidity.readthedocs.io/en/develop/abi-spec.html#function-selector">function selectors as defined by the Ethereum ABI</a>. This a subset of <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://solidity.readthedocs.io/en/develop/abi-spec.html">Solidity’s concept of interfaces</a> and the <code>interface</code> keyword definition which also defines return types, mutability and events.</p><p>We define the interface identifier as the XOR of all function selectors in the interface.</p></blockquote><p>示例代码：</p><pre data-type="codeBlock" text="pragma solidity ^0.4.20;

interface Solidity101 {
    function hello() external pure;
    function world(int) external pure;
}

contract Selector {
    function calculateSelector() public pure returns (bytes4) {
        Solidity101 i;
        return i.hello.selector ^ i.world.selector;
    }
}
"><code><span class="hljs-meta"><span class="hljs-keyword">pragma</span> <span class="hljs-keyword">solidity</span> ^0.4.20;</span>

<span class="hljs-class"><span class="hljs-keyword">interface</span> <span class="hljs-title">Solidity101</span> </span>{
    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">hello</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">external</span></span> <span class="hljs-title"><span class="hljs-keyword">pure</span></span></span>;
    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">world</span>(<span class="hljs-params"><span class="hljs-keyword">int</span></span>) <span class="hljs-title"><span class="hljs-keyword">external</span></span> <span class="hljs-title"><span class="hljs-keyword">pure</span></span></span>;
}

<span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">Selector</span> </span>{
    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">calculateSelector</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">pure</span></span> <span class="hljs-title"><span class="hljs-keyword">returns</span></span> (<span class="hljs-params"><span class="hljs-keyword">bytes4</span></span>) </span>{
        Solidity101 i;
        <span class="hljs-keyword">return</span> i.hello.<span class="hljs-built_in">selector</span> <span class="hljs-operator">^</span> i.world.<span class="hljs-built_in">selector</span>;
    }
}
</code></pre><h2 id="h-" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">课程学习视频分享</h2><p>Ethers入门的第12课 - 识别ERC721合约的学习视频分享同步发布在了Youtube和B站，请戳以下链接访问观看。</p><div data-type="youtube" videoId="3vOBm4v_7c8">
      <div class="youtube-player" data-id="3vOBm4v_7c8" style="background-image: url('https://i.ytimg.com/vi/3vOBm4v_7c8/hqdefault.jpg'); background-size: cover; background-position: center">
        <a href="https://www.youtube.com/watch?v=3vOBm4v_7c8">
          <img src="{{DOMAIN}}/editor/youtube/play.png" class="play"/>
        </a>
      </div></div><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.bilibili.com/video/BV1ky4y1o7v5/">https://www.bilibili.com/video/BV1ky4y1o7v5/</a></p><p>希望以上信息的分享能更好的帮助Web3 Buidler们学习WTF学院Ethers入门的第12课。</p><div data-type="subscribeButton" class="center-contents"><a class="email-subscribe-button" href="null">Subscribe</a></div>]]></content:encoded>
            <author>01coder@newsletter.paragraph.com (01Coder)</author>
            <enclosure url="https://storage.googleapis.com/papyrus_images/3f1ba7500b2b202eafae5fec4ba4d2c574c7b671e7a3c933d5f19d2d0742450f.jpg" length="0" type="image/jpg"/>
        </item>
    </channel>
</rss>