<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by CryptoBase on Medium]]></title>
        <description><![CDATA[Stories by CryptoBase on Medium]]></description>
        <link>https://medium.com/@_cryptobase?source=rss-90d65e7f8f4d------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*qMOjB5_OaQiLU8IBVkJDOw.jpeg</url>
            <title>Stories by CryptoBase on Medium</title>
            <link>https://medium.com/@_cryptobase?source=rss-90d65e7f8f4d------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Wed, 20 May 2026 04:39:07 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@_cryptobase/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[Solidity Const vs Immutable｜面試必考題]]></title>
            <link>https://medium.com/@_cryptobase/solidity-const-vs-immutable-%E9%9D%A2%E8%A9%A6%E5%BF%85%E8%80%83%E5%B7%AE%E7%95%B0-level-1-18d5240c2be5?source=rss-90d65e7f8f4d------2</link>
            <guid isPermaLink="false">https://medium.com/p/18d5240c2be5</guid>
            <category><![CDATA[solidity]]></category>
            <category><![CDATA[interview]]></category>
            <dc:creator><![CDATA[CryptoBase]]></dc:creator>
            <pubDate>Thu, 01 Jan 2026 17:30:02 GMT</pubDate>
            <atom:updated>2026-01-02T15:28:18.360Z</atom:updated>
            <content:encoded><![CDATA[<blockquote><strong><em>const</em> 跟 </strong><strong><em>immutable</em> 的差別 不只是編譯期與部署時決定！</strong></blockquote><h4><strong>為什麼面試官愛問這一題？</strong></h4><p>因為面試官真正想確認的，是你是否真的理解 Solidity 在底層是怎麼運作的，會直接暴露你是否理解：</p><ul><li>Solidity 的編譯流程</li><li>變數是在哪個階段被寫進 bytecode</li><li>不同宣告方式，如何影響 gas 與 runtime 行為</li><li>你是否只停留在「語法層級」，還是已經進入「執行層級」的理解</li></ul><p>換句話說，這是一題 <strong>低門檻，但鑑別度極高</strong> 的問題</p><p>我會用 <strong>3 篇文章</strong>，從以下幾個維度完整拆解 const 與 immutable 在 Solidity 中的差異</p><ul><li>編譯時（Compile Time）的差異</li><li>編譯後 Initcode 的差異</li><li>合約部署時的行為差異（包含 Gas 差異）</li><li>部署後 Runtime Bytecode 的差異</li><li>Gas Optimize 開關前後，兩者的影響</li><li>資料實際存放位置的不同</li><li>讀取資料時，EVM 行為上的差異</li></ul><p>以下的數據來自這邊的 <a href="https://github.com/TsengMJ/solidity_interview_question_demo/blob/main/src/ConstImmutableDemo.sol">Demo Code</a></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*DWu8IVP8IfblPCEXmXLdeA.png" /><figcaption>Demo 數據</figcaption></figure><h4>問題1: 為何 Immutable 的 Initcode 比 Const 跟 Storage 都大？</h4><p>Initcode 它的工作只有三件事：</p><ol><li>接收 Constructor 參數</li><li>做初始化（包含 Immutable）</li><li>把 Runtime Bytecode 組好，然後 RETURN 給 EVM</li></ol><p>evm 最後只會留下 runtime code，但 initcode 本身要負責「把它生出來」</p><blockquote><strong>Const 的 Initcode 幾乎不用做事</strong></blockquote><p><strong>因為</strong>值在<strong>編譯期就完全確定，所以</strong>編譯器可以直接 inline 到 opcode，或當成 literal 嵌進 bytecode，也就是合約在初始化時，Initcode 大概會像是：</p><pre>CODECOPY<br>RETURN runtime</pre><blockquote><strong>Storage 的 Initcode 需要做 <em>SSTORE</em></strong></blockquote><p>相比於 Const，會需要多處理 CallData 讀取以及 Storage 寫入操作，所以 Initcide 會比 Const 的指令多這幾個操作</p><pre>CALLDATALOAD        // 讀 constructor 參數<br>PUSH &lt;slot&gt;<br>SSTORE              // 寫入 storage</pre><blockquote><strong>Immutalbe 的 Initcode 需要把數據寫到 Runtime Bytecode 的指定位置裡</strong></blockquote><p>一樣跟 Storage 都要處理 CallData 讀取，雖然沒有 Storage 寫入操作，但是計算數據寫入的 offset 以及寫入 bytecode，總的 opcodes 數量會比 storage 多</p><pre>CALLDATALOAD  // 讀 calldata<br><br>PUSH &lt;offset&gt; //計算 immutable offset<br>ADD<br><br>MSTORE        // 把值寫進 memory 中的 runtime template<br>CODECOPY      // copy runtime code<br>RETURN</pre><h4>問題2: 為何 Immutable 的 Runtime Size 也比 Const 跟 Storage 都大？</h4><blockquote><strong>Const 數據讀取指定簡單粗暴</strong></blockquote><pre>PUSH &lt;value&gt;</pre><blockquote><strong>Storage 因為要間接從 Slot 裡讀取</strong></blockquote><pre>PUSH &lt;slot&gt;<br>SLOAD</pre><blockquote><strong>Immutable 變量都直接存 Runtime Code 了～</strong></blockquote><p>除了 變量之外，讀取時也需要從 Runtime Code 中讀取</p><pre>PUSH &lt;offset&gt;<br>MLOAD</pre><h4>問題3: 為何 Immutable 跟 Const 變量 Read 操作 Gas 一樣？</h4><blockquote><strong>應該是說在 Gas 消耗上 Immutable ≥ Const</strong></blockquote><p>問題2 雖然說 Immutable 在讀取時會有兩個指令，但是實際上多數情況新版本的編譯器都能將變量優化成變成 inline ，結果操作會跟 const 一樣一個 PUSH而已</p><h4>問題4: 為何 Optimize 開啟後 Immutable 跟 Const 的 Read Gas 還能下降？</h4><blockquote><strong>實際並沒什麼優化</strong></blockquote><p>Gas 優化部分其實都是在其他地方，像是 Function 中消掉多餘的 DUP/SWAP 以及 合併相同的 return path 等等</p><h4>總結</h4><blockquote>const 是編譯期常數，永遠 inline、永遠最小；<br>immutable 是部署期常數，用 bytecode size 換 runtime gas，<br> 多數時候接近 const，但不保證一樣快。</blockquote><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=18d5240c2be5" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>