<?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 Vins Lai @vins.ton on Medium]]></title>
        <description><![CDATA[Stories by Vins Lai @vins.ton on Medium]]></description>
        <link>https://medium.com/@tpayvins?source=rss-c5fae3649355------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*tarfWskBc9x8pr4Tp1NvVQ@2x.jpeg</url>
            <title>Stories by Vins Lai @vins.ton on Medium</title>
            <link>https://medium.com/@tpayvins?source=rss-c5fae3649355------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Fri, 26 Jun 2026 14:57:53 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@tpayvins/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[eth 1.x 與無狀態節點介紹：從以太坊區塊鏈當前的困境談起]]></title>
            <link>https://medium.com/cryptocow/eth1-x-stateless-clients-deddc3f935bb?source=rss-c5fae3649355------2</link>
            <guid isPermaLink="false">https://medium.com/p/deddc3f935bb</guid>
            <category><![CDATA[technology]]></category>
            <category><![CDATA[blockchain]]></category>
            <category><![CDATA[ethereum]]></category>
            <category><![CDATA[ethereum-blockchain]]></category>
            <category><![CDATA[eth2]]></category>
            <dc:creator><![CDATA[Vins Lai @vins.ton]]></dc:creator>
            <pubDate>Mon, 06 Jul 2020 11:50:11 GMT</pubDate>
            <atom:updated>2020-07-06T11:52:18.998Z</atom:updated>
            <content:encoded><![CDATA[<h3>eth 1.x 與無狀態節點介紹</h3><h4>從以太坊區塊鏈當前的困境談 eth 1.0 ➔ eth 1.x 升級和 stateless clients 改動</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*oYsFtb2JCWZflR3bmpYUEA.png" /></figure><p>本篇文章將剖析 eth 1.0 存在的各項問題，並介紹 Ethereum Foundation 提出的 eth 1.x 升級相關改動能如何改善當前以太坊的困境。</p><h3>什麼是 eth 1.x</h3><p>以太坊 2.0 的研究行之有年，迄今（2020/06 ）距離全面啟動仍需要 2–3 年的時間，並且 eth 2.0 將被部署為由信標鏈（Beacon Chain）與多條分片鏈（Shard Chains）構成的獨立區塊鏈，而 eth 1.0 需要經過改動與升級方能成為 eth 2.0 中的其中一條分片鏈。這意味著現在運行的以太坊 1.0 區塊鏈需要進行改動，並且在未來的 5~10 年保持運作，持續發展。而 <strong>eth 1.x 即為以太坊 1.0 升級版本的代稱。</strong></p><p>eth 1.x 的首要目標旨在解決現在區塊鏈日益增長的資料負擔，在區塊鏈大小持續增長的情況下保持 eth 1.0 網路的彈性。</p><h3>以太坊 1.0 的弊端與問題</h3><p>在開始介紹以太坊 1.x 之前，必須先認知到目前（2020/06）以太坊存在的問題，如此方能充分瞭解 eth 1.x 被提出的背景與旨在解決的痛點。</p><h4>Problem (A)：網路趨於中心化</h4><p>自 2020/05 以來，Gas Price 的節節攀升導致開發者與高頻率使用者叫苦連天，其背後原因除了以太坊用戶數量的增加，亦是由於<strong>耗費大量 Gas 的智慧合約互動行為</strong>比例提升（單純轉帳 ETH 的占比被稀釋），使得以太坊網路持續壅塞。</p><p>面對這樣的情景，礦工社群於 2020/6/19 UTC 投票通過，將每個區塊的 Gas Limit 從 10,000,000 提升到 12,000,000。</p><p>截至 2020/06/30，儘管每個區塊的 Gas Limit 提升至 12,000,000，合約交易占比的提升依舊讓每個區塊所能容納的交易數十分有限，在 <a href="https://etherscan.io/">Etherscan</a> 上可以查看到以太坊的 TPS（Transactions Per Second）在 Gas Limit 提升前平均落在 12 左右（低於號稱的 15 TPS）；在 Gas Limit 擴增後，TPS 亦沒有出現明顯的提升。</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*McGwxPeAaUNHxl4IvhqxNg.png" /><figcaption><a href="https://etherscan.io/">etherscan.io</a></figcaption></figure><p>可能有些人會想說既然 12,000,000 Gas Limit 依舊壅塞，那怎麼不再往上提升？原因是 Gas Limit 的提升將導致<strong>每個區塊的處理時間變長</strong>，進而造成 <strong>Uncle Block 的數量增加</strong>，使得<strong>網路的共識機制變不健康</strong>，礦工必須耗費大量額外運算來進行處理。</p><p>此外，由於獨立節點與小型礦池更容易挖到 Uncle Block，長期下來出塊獎勵的期望值降低將導致部分節點入不敷出，進而離開網路。如此將讓以太坊網路變得更加<strong>中心化</strong>，更<strong>向大型礦池集中</strong>，危害了網路的長期健康與安全性。</p><h4>Problem (B)：狀態爆炸</h4><p>隨著越來越多的智慧合約被部署，以及大量的合約互動行為，導致以太坊網路需要儲存的<strong>「狀態」大小正以「等比級數」增長</strong>。狀態的增長即反映在節點的儲存空間大小上。</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*oCGgKKd3Hdk-dKr6seYCHg.png" /></figure><p>筆者於另一篇文章中摘要介紹了以太坊網路中的節點：<br><a href="https://medium.com/pelith/ethereum-nodes-d3e07745d189?source=friends_link&amp;sk=f30a16455e43b692963e88860fd5eca1"><strong>全節點與輕節點：以太坊節點面面觀 &lt;10&gt; 文組也該知道的區塊鏈技術知識</strong></a></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/920/0*IPZZtl3vMnrRyoZ8.png" /></figure><p>在 2019 年年底，全節點的每月增長大小「小於 20 GB」；到了 2020/06，隨著 Gas Limit 的提升，全節點的每月增長大小「逼近 40 GB」。狀態不斷加速增長的結果會對以太坊網路的性能帶來衰退與網路健康的損害。未來全節點的運行將會變得更加艱難，可能導致網路變得越來越「中心化」。</p><p>此外，區塊驗證的難度將隨之提升，導致<strong>整體網路的延遲與 TPS 的進一步下降。</strong></p><p>儘管這個過程如同溫水煮青蛙，在數年之後才會導致以太坊網路出現巨大的安全性問題，然而為了避免走到那步田地，早在數年前便開始以太坊 2.0 的相關研究與開發。</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*kCwKrWhJrUFVWwP3aonsCg.jpeg" /><figcaption><a href="https://twitter.com/VitalikButerin/status/1240365047421054976?s=20">Roadmap of Ethereum tweeted by Vitalik on 2020/3/19</a></figcaption></figure><h3>以太坊的未來</h3><p>Vitalik 於 2020/3/19 在<a href="https://twitter.com/VitalikButerin/status/1240365047421054976?s=20">推特</a>上分享了他對於以太坊未來 5~10 年發展觀點的路線圖，主要由以下四個部分構成：</p><ul><li>eth 1.x other</li><li>eth 1.x statelessness（無狀態性）</li><li>eth 2 phase 0 prep（核心路徑，聚焦於 eth 1 ➔ eth 2 合併，移除PoW）</li><li>eth 2 phase 2 and beyond</li></ul><p>圖中間的橫軸代表時間線，沿著時間軸是一個從 Phase 0 啟動，到 Phase 1，再到「eth1 ➔ eth2 合併」的「核心路徑」。要完成合併有三個先備條件：</p><ul><li>eth 2 phase 1</li><li>eth1 ➔ eth2 合併的規範與實現</li><li><strong>eth 1.x statelessness（無狀態性）</strong></li></ul><p>其中，<strong>「eth 1.x statelessness（無狀態性）」</strong>可說是對於 eth1 ➔ eth2 合併最至關重要的一個條件，本文將以「無狀態性」為主軸做相關的介紹。</p><h3>狀態爆炸對以太坊網路的影響</h3><p>由於以太坊區塊鏈的本質是一台依靠礦工維護的去中心化大型「狀態機」，隨著區塊數量的增加更迭狀態，不斷向前移動。以太坊的完整「狀態」包含<strong>所有個人帳戶和餘額的當前狀態</strong>，以及在 EVM 中部署和運行的<strong>所有智慧合約的整體記憶體。</strong></p><p>以太坊網路在每個區塊高度都只有唯一一個獲得全網所有節點共識的「狀態」，這個「狀態」在每一個新區塊會產生變動並隨著區塊接至區塊鏈上。</p><p>礦工在執行交易運算時，必須依據交易內容至節點內以「Merkle-Patricia Trie 」資料結構組成的狀態樹中更改相關的狀態值，再重新計算出每個樹狀節點的 hash 值，算出新的「Merkle Root」，生成新的狀態樹。</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*CjQuCYZ6XKkXkUfc.png" /><figcaption>圖片來源：<a href="https://blog.ethereum.org/">https://blog.ethereum.org/</a></figcaption></figure><p>截至 2020/06，當前的以太坊網路中約有 5 億個狀態值，總狀態大小約為 10 GB，狀態會隨著網路上的帳戶與智慧合約數量增加而按比例增長。因此，如果以太坊繼續獲得主流採納，狀態可能會在未來數年持續爆發性增長。不斷擴大的狀態主要會對節點造成兩大影響：</p><h4>節點讀取狀態耗時增加，交易處理速度變慢</h4><p>目前每個新區塊礦工大約需要添加或修改 3000~6000 個狀態值。由於礦工處理每一筆交易時都必須要讀取節點資料庫中狀態的相關資訊，當狀態數量持續增長，在狀態樹中查詢到指定狀態值的耗費時間就越長。</p><h4>建構新的狀態樹耗時更長，區塊驗證速度減慢</h4><p>當礦工將交易處理完時，必須建構一個由新的狀態組成的 Trie 結構狀態樹，當中涉及大量的 hash 值運算。計算完 Root Hash 方能建構出新的 Block Header，打包出新區塊。</p><h4>小結</h4><p>綜合來說，持續增大的「狀態」與「節點大小」將導致<strong>新的全節點啟動成本大幅提升</strong>：對於「儲存空間」的需求與「同步時間」的增加可能會進一步導致網路中<strong>全節點數量的減少</strong>。</p><p>此外，以太坊網路的整體性能下降也在所難免。以太坊隨著狀態樹查詢與運算耗時的增加以及越來越多的合約交易，TPS 可能會進一步下降，導致網路變得更加壅塞，迎來更高的 Gas Price 競逐。</p><h3>eth 1.x 的提出</h3><p>對於以太坊 1.0 升級的相關研究最早可以溯及到 2018/10 在捷克布拉格召開的 Devcon IV，會議談論到以太坊 2.0 無法在未來 3~5 年內完全取到以太坊 1.0 的所有功能，因此 eth 1.0 仍必須保持安全穩定運行，於是乎無數的核心開發人員開始研究一系列延長 eth 1.0 壽命以及與 eth 2.0 介接的解決方案。</p><p>既然狀態的持續增大對於以太坊網路的健康帶來重大影響，解決方案之一便是<strong>「消除以太坊網路對狀態的需求」</strong>。細看 Vitalik 於 2020/3/19 發布的以太坊未來路線圖中即可看到一系列的解決方案：</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Nw4QOAvhIYkvHkMAWkhkiw.png" /></figure><p>上述的路線圖是較為精要的版本，以太坊研究員 Griffin Ichiba Hotchkiss 於 2020/4/2 在 <a href="https://blog.ethereum.org/2020/04/02/eth1x-stateless-tech-tree/">Ethereum Blog</a> 分享了他對於目前 eth 1.x 研究開發方向的理解，整理出下圖的「技能樹」：</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*YYF26V9_0-dYhkUNRriWIA.png" /><figcaption><a href="https://blog.ethereum.org/2020/04/02/eth1x-stateless-tech-tree/">2020/4/2 更新的 eth 1.x 科技樹</a></figcaption></figure><p>由於細節族繁不及備載，本文只會挑出其中幾個核心來做說明。有興趣的朋友可以參考並持續關注 <a href="https://blog.ethereum.org/">Ethereum Blog</a> 中的相關文章：</p><blockquote><a href="https://blog.ethereum.org/2020/04/02/eth1x-stateless-tech-tree/"><strong>The 1.x Files: The Updated Stateless Tech Tree</strong></a><strong><br>（April 2, 2020）</strong></blockquote><blockquote><a href="https://blog.ethereum.org/2020/05/04/eth1x-witness-primer/"><strong>The 1.x Files: A Primer for the Witness Specification</strong></a><strong><br>（May 4, 2020）</strong></blockquote><blockquote><a href="https://blog.ethereum.org/2020/06/16/eth1x-1559/"><strong>The 1.x Files: EIP 1559 and the Ethereum Improvement Horizon</strong></a><strong><br>（June 16, 2020）（Up to date）</strong></blockquote><h3>eth 1.x 的目的</h3><p>簡而言之，eth 1.x 的核心目的有兩個：</p><h4>(A) 延長 eth 1.0 的壽命</h4><p>在區塊持續增長的情況下維持 eth 1.0 區塊鏈的安全、穩定與彈性，讓人們可以選擇僅下載部分的狀態，在較便宜的硬體上運行節點。</p><h4>(B) 與 eth 2.0 介接</h4><p>由於 eth 2.0 中的分片（shards）將是無狀態的，因此「無狀態」將是參與 eth 2.0 區塊驗證的先決條件。eth 1.0 要與 eth 2.0 相容的話勢必得支援無狀態運作，方能順利過度，與 eth 2.0 介接。</p><p>為了達成這兩個目的，在技能樹圖最右側的終點我們可以看到<strong>「無狀態以太坊 Stateless Ethereum」</strong>。然而，「無狀態」的以太坊這個詞可能有些不夠精確，因為整個以太坊網路就是基於狀態而存在的。</p><p>具體來說，是<strong>找到一種方式讓以太坊網路中的部分節點可以將「保留整個以太坊狀態的副本」這件事變為一個選項，而非必須。</strong>因此，要讓現行的以太坊網路能夠支援<strong>沒有保存完整全網狀態</strong>的輕量級節點：「無狀態節點」參與到網路中的新區塊驗證。</p><p>而為了讓無狀態節點能夠進行驗證，以太坊 1.x 提出了以下三項主要改動，我們將逐一來進行介紹：</p><h4>(1) 區塊見證機制</h4><h4>(2) EVM 改動</h4><h4>(3) 資料結構轉換為二進位制（Binary）</h4><h3>(1) 區塊見證機制</h3><h4>無狀態節點如何參與驗證</h4><p>簡單來說，作法是：擁有全網狀態資訊的「完整狀態節點 Full State Node」在打包新區塊時會一併產生「區塊見證 Block Witness」，讓沒有保存全網狀態的「無狀態節點」能<strong>藉由區塊見證提供的資訊對新區塊進行驗證</strong>。</p><h4>什麼是「區塊見證 Block Witness」</h4><p>前面提到，以太坊的資料結構是由約 5 億個狀態值所構成的 Merkle-Patricia Trie。然而，其中大約<strong>只有 0.1% 狀態值（約 50 萬個）會隨著區塊高度產生變化</strong>，如：個人帳戶的 ETH 餘額、合約底下記載的每個地址持有 Token 數量。99.9% 的狀態值如：智慧合約的程式碼、Uniswap 手續費 0.3% 的參數等資訊一但智慧合約部署完成便不會再進行更動。</p><p>由於一個新的區塊（目前為 1,200 萬 Gas Limit）至多只能容納 571 筆交易，其涉及的狀態值更改是十分有限的。那麼一個沒有儲存所有狀態值的無狀態節點只要向擁有完整狀態的節點請求<strong>涉及交易的相關狀態值</strong>與<strong>未涉及到的 hash 值</strong>其實即可算出 Merkle Root 進行驗證。</p><p>如下圖所示，假設底層的 14 個菱形代表以太坊網路中所有的狀態值，而新區塊中僅有一筆交易，針對綠色的狀態值進行更改，那麼無狀態節點其實只需要 1 個綠色的原狀態值以及紫色的 Hash 值與其它未變動的 6 個 Hash 值資訊即能透過 4 次 Hash 值計算，算出新的 Root Hash（Merkle Root），而不需要擁有所有的 14 個狀態值來進行 9 次 Hash 值計算。</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/960/0*qaqZtSQuU2ABzYSr" /><figcaption>圖片來源：<a href="https://blog.ethereum.org/">https://blog.ethereum.org/</a></figcaption></figure><p>這些為了完成 Root Hash 計算所需要向擁有全網狀態資訊的「完整狀態節點（全節點）」請求的「最小資訊量」即為「區塊見證 Block Witness」，包含了狀態 Trie 中「不涉及變動的部分 Hash 值」與「涉及變動的原狀態值」。如此一來，沒有保存完整全網狀態的「無狀態節點 Stateless Client」將可以藉由請求而來的「區塊見證」資訊計算出新的 Root Hash。</p><p>為了便於讓無狀態節點參與驗證，目前的最新研究方向是<strong>「區塊見證」將可能成為「區塊標頭 Block Header」的一部分</strong>，隨著新挖出的區塊一併廣播給全網節點，讓無狀態節點不用再發起額外的「區塊見證請求」即能進行驗證區塊的動作。</p><p>透過這樣的方式，<strong>無狀態節點即能參與以太坊網路中新區塊的驗證。</strong></p><p>礙於篇幅，我們在這篇文章只會做概念性的闡述，具體的實作細節先不展開細說，想更進一步瞭解的朋友可以參考我上方附上的連結以及以太坊部落格中的其它相關文章。</p><h3>(2) EVM 改動</h3><p>狀態值的更改和運算都是在 EVM 中進行，同理，區塊見證也必須經由全節點的 EVM 透過運算來生成。EVM 的改動目標與成本和激勵機制息息相關，主要包含<strong>耗費 Gas 的估算</strong>以及如何<strong>降低對節點間廣播延遲的影響</strong>。</p><h4>區塊見證 Gas 計算（Witness Gas Accounting）</h4><p>由於區塊見證必須由全節點花費額外的算力來運算生成，因此會產生相應的 Gas 成本，而這個成本目前比較可行的方式是<strong>由交易的發起者來進行負擔。</strong>至於如何讓交易發起者在發送交易時即能準確估算額外的 Gas，以設定精確的 Gas Limit，目前仍在研究中，尚未產生明確的定案。</p><p>另外，考慮到在同個區塊中可能有一個狀態值被不止一筆交易進行更改，因而產生重複支付 Gas 的情形，這部分可能會成為礦工額外的獎勵費用。</p><h4>智慧合約程式碼分塊（Code Merkleization）</h4><p>區塊見證的目的是為了讓無狀態節點能夠進行新區塊的驗證，其中必定包含了智慧合約相關的運算。然而，無狀態節點沒有儲存包含智慧合約程式碼在內的狀態，所以當無狀態節點要進行一筆智慧合約交易的狀態運算時，便需要一併擁有包含智慧合約程式碼的在內區塊見證。</p><p>這時會有另外一個問題，智慧合約洋洋灑灑的程式碼中可能只有其中的一小片段是與該交易運算相關聯的，因此「程式碼分塊」的概念被提出。</p><p>「程式碼分塊」是一種拆分智慧合約位元組碼（Bytecode）的方式，<strong>將智慧合約中與涉及交易相關的程式碼拆出，作為區塊見證中的一部分</strong>，一併提供給無狀態節點讓其做運算驗證之用。</p><p>其目的便是避免調用到不必要的程式碼，免於生成龐大的區塊鏈見證導致運算時間的增加及節點間傳遞溝通的延遲。</p><h3>(3) 資料結構轉換為二進位制（Binary）</h3><p>根據以太坊研究員 Igor Mandrigen 進行的實驗（<a href="https://medium.com/@mandrigin/stateless-ethereum-binary-tries-experiment-b2c035497768">Binary Tries Experiment</a>），若將以太坊資料結構從目前的<strong>十六進位制（Hex）更改為二進位制（Binary）</strong>，每個區塊的區塊見證大小將能從 800~3,400 kB 縮小至 300~1,400 kB，如此將<strong>大幅減低區塊見證在網路中傳播的延遲時間</strong>，讓區塊見證機制能夠運行得更加理想。</p><p>然而從 Hex 轉換為 Binary 具體的實作方式以及過度策略目前仍未有完全的定論，有興趣的朋友可以持續關注 Ethereum Foundation 釋出的相關消息。</p><h3>無狀態以太坊 Stateless Ethereum</h3><p>介紹至此，透過引入「區塊見證機制」、對「EVM」進行必要的改動，以及將資料結構轉換為「二進位制」，已能勾勒出 eth 1.x 的大致樣貌。</p><p>支援無狀態節點的 1.x 網路，將能夠對以太坊 1.0 的區塊鏈網路產生下方幾點關鍵影響：</p><h4>&lt;i&gt; 對新加入節點更加友善</h4><p>隨著全網狀態的膨脹與區塊高度的提升，啟動一個新節點的同步時間會變得越來越長（截至 2020/06，啟動一個新全節點需要同步至少一週的時間），超長耗時的原因是因為<strong>全節點的同步必須從創世區塊開始對每一個區塊進行驗證與同步的動作</strong>，而驗證區塊必須要擁有該區塊高度的全網狀態，因此在每一個區塊同步狀態是目前同步節點的極大瓶頸。</p><p>無狀態節點時代的到來將能夠大幅改善同步區塊的痛苦過程，未來<strong>僅需憑藉「區塊標頭」與「區塊見證」即能完成區塊的驗證</strong>，同步節點體驗的改善將能讓更多人有意願且能夠負擔運行節點的成本（時間與硬體資源）。</p><h4>&lt;ii&gt; 輕節點得以自力更生</h4><p>在現行的以太坊網路中，輕節點不具備獨立驗證新區塊與驗證交易的能力，因為輕節點沒有保存驗證交易需要的 merkle proof 資訊，因而必須向鄰近全節點發出 p2p request 進行請求，但輕節點現在願意提供支援的佛心全節點變得越來越少。</p><p>無狀態機制將能幫助輕節點依靠自己維護的部分狀態（自己帳戶與合約的餘額等資訊），<strong>以區塊標頭和區塊見證獨立進行驗證</strong>，不求於人。</p><h4>&lt;iii&gt; 節點網路安全性提升</h4><p>由於區塊鏈網路的安全性取決於能參與新區塊驗證的節點總數量，對網路的攻擊成本將隨著節點總數量的增加而提高，能有效地低系統被擊潰的風險。</p><p>隨著新節點啟動成本的降低以及大量的輕節點投入到新區塊的驗證中，將讓網路的整體安全性大幅提升。</p><h4>&lt;iv&gt; 介接 eth 2.0</h4><p>最後一點也是最核心的一點，前面提到 eth 2.0 將會是由核心的信標鏈與多條分片鏈構成，全網的狀態將被多個分片分開儲存。由於每條分片各自擁有不同的狀態，並且沒有保存其它分片的狀態資訊。因此<strong>對每條分片來說，其它條分片都像是「無狀態節點」。</strong></p><p>為了能夠在多條分片鏈間有效驗證與同步，必須依靠<strong>「無狀態的驗證機制」</strong>。因此現在的 eth 1.0 未來要能順利成為 eth 2.0 的其中一條分片鏈，升級為<strong>無狀態的 eth 1.x</strong> 是至關重要的一個步驟。</p><h3>結論</h3><p>透過以上介紹，相信讀者們應該對於現行的 eth 1.0 升級到 eth 1.x 需要進行的改動，以及改動完成後的未來有更清晰的認識。</p><p>在 eth 1.x 升級完成後，人們將能用便宜的硬體運行自己的無狀態節點（輕節點），更多能夠參與驗證的輕節點可以進一步維護全網的安全性。</p><p>擁有無狀態驗證機制的 eth 1.x 方能順利和 eth 2.0 的信標鏈與其它分片鏈介接，正式讓以太坊網路進入由<strong>無狀態驗證機制</strong>與<strong>分片技術</strong>構築成的輕量化 eth 2.0 未來。</p><p>以上，若有任何</p><p><strong>A. 我寫得不夠清楚的地方<br>B. 撰寫上改進的建議<br>C. 希望我能夠撰寫分享的區塊鏈技術知識內容</strong></p><p>都非常歡迎在底下留言回覆。希望我的文章能幫助到更多像我一樣想學習區塊鏈技術與知識的朋友。如果您覺得讀完有所收穫，也希望能</p><ul><li><strong>給我 50 claps</strong></li><li><strong>分享給您的朋友們</strong></li></ul><p>謝謝大家！</p><p>也歡迎大家閱讀區塊鏈技術知識系列的<a href="https://medium.com/pelith/blockchain-technical-overview-8c2a643424fa?source=friends_link&amp;sk=d5215878afe5e224f288ef8fb7156329">其它篇文章</a>：<br><a href="https://medium.com/pelith/blockchain-technical-overview-8c2a643424fa">https://medium.com/pelith/blockchain-technical-overview-8c2a643424fa</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=deddc3f935bb" width="1" height="1" alt=""><hr><p><a href="https://medium.com/cryptocow/eth1-x-stateless-clients-deddc3f935bb">eth 1.x 與無狀態節點介紹：從以太坊區塊鏈當前的困境談起</a> was originally published in <a href="https://medium.com/cryptocow">CryptoCow</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[全節點與輕節點：以太坊節點面面觀 <10> 文組也該知道的區塊鏈技術知識]]></title>
            <link>https://medium.com/pelith/ethereum-nodes-d3e07745d189?source=rss-c5fae3649355------2</link>
            <guid isPermaLink="false">https://medium.com/p/d3e07745d189</guid>
            <category><![CDATA[blockchain]]></category>
            <category><![CDATA[bitcoin]]></category>
            <category><![CDATA[technology]]></category>
            <category><![CDATA[ethereum]]></category>
            <category><![CDATA[course]]></category>
            <dc:creator><![CDATA[Vins Lai @vins.ton]]></dc:creator>
            <pubDate>Wed, 03 Jun 2020 08:45:31 GMT</pubDate>
            <atom:updated>2020-06-19T07:49:46.104Z</atom:updated>
            <content:encoded><![CDATA[<h4>Blockchain Technical Overview &lt;10&gt; Light node / Full node / Archive node — Brief Introduction to Ethereum Nodes</h4><blockquote><em>收看本系列文章的讀者，應該都對於區塊鏈的基本原理和架構有些概念，如果沒有，推薦您先去 Google 搜尋 </em><strong><em>區塊鏈、比特幣、以太坊</em></strong><em>這些關鍵字了解一下。我們將在這些基礎概念之上，來談區塊鏈的技術知識。本系列文章並不會談到太深的技術鑽研，而是希望以</em><strong><em>深入淺出</em></strong><em>的方式讓每一個想要搞懂區塊鏈技術的人都能在讀完後說出：</em><strong><em>原來如此！</em></strong></blockquote><blockquote><em>本系列文章由區塊鏈技術解決方案開發公司：</em><strong><em>Pelith</em></strong><em> 編撰。內容皆經過諸位區塊鏈資深研究員及開發者</em><strong><em>校對與驗證</em></strong><em>，盡可能確保</em><strong><em>內容正確無誤</em></strong><em>，讓讀者能安心吸收</em><strong><em>正確的區塊鏈技術知識</em></strong><em>。</em></blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*gszMJJMVozVR3b9ccYGRVg.png" /></figure><p>在本系列過往的文章中我們逐一介紹了以太坊各個環節的運作機制，相信有在持續關注的讀者都已對以太坊技術架構有粗略的認識。</p><p><a href="https://medium.com/pelith/oracle-a2016c17a56f?source=friends_link&amp;sk=5fa18e5bbed802e24ff7d9120bca48f4">上一篇</a> 我們用較長的篇幅完整解析「<a href="https://medium.com/pelith/oracle-a2016c17a56f?source=friends_link&amp;sk=5fa18e5bbed802e24ff7d9120bca48f4"><strong>預言機 Oracle：區塊鏈與現實世界的橋樑</strong></a>」<strong>。</strong></p><p>因應以太坊 2.0 的即將來臨，本篇文章將針對以太坊節點（Ethereum Nodes）做概論性的介紹，讓讀者能充分瞭解節點的運作機制。</p><h3>以太坊網路 Ethereum Network</h3><p>以太坊 Ethereum 是由分散式節點所組成的網路架構，這些節點稱為「以太坊節點 Ethereum Nodes」或「以太坊客戶端 Ethereum Clients」。任何人只要有規格足夠的電腦硬體設備都能夠加入以太坊網路中成為節點，貢獻算力賺取區塊挖礦獎勵。截至 2020/05，分佈在全世界各地的以太坊節點總共約有 5,756 個。</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*KtO0X565OaDXlVmiwF0AiA.png" /><figcaption>來源：<a href="https://www.ethernodes.org/">https://www.ethernodes.org/</a></figcaption></figure><p>在當前的以太坊網路中，每個節點都是相互平等的，彼此間<strong>即時溝通「同步區塊資料」及「打包待出塊的交易（挖礦）」</strong>來維持以太坊區塊鏈的運作，我們可以透過下圖一覽節點的主要作業內容：</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/882/1*lVtcDzQzjRSvlJ_ep1l7gA.png" /></figure><h4>以太坊節點所做的工作</h4><ul><li>Receive Transactions：接收來自<strong> DApp、錢包 或 其它節點 </strong>的交易資訊</li><li>Receive Blocks：從其它節點接收區塊資訊同步至最新的區塊高度</li><li>Validating：驗證新的區塊之正確性、驗證待處理交易之有效性</li><li>Executing：處理交易，進行運算並更改狀態值，打包成新區塊</li><li>Mining：用電腦算力來計算 nonce 值，最先找到 nonce 值出塊並廣播的礦工可以獲得區塊獎勵與所有交易之手續費（Gas）</li><li>Consensus：通過共識機制達成全網帳本之一致性或區塊重組（reorg）</li></ul><p>以上便是以太坊節點常態性的工作內容，正是這些分佈在全球的數千個節點們不間斷地工作維繫了以太坊區塊鏈的正常運作。</p><p>然而其實節點有許多不同形式，上述參與所有工作內容（包含接收、驗證、挖礦）的節點僅是大眾普遍認知的其中一種形式，接著我們將介紹現行各種不同形式的節點。</p><h4>以太坊的節點種類 Ethereum Nodes</h4><p>在以太坊網路中，節點大致可被分為<strong>「全節點 Full Node」、「輕節點 Light Node」、「歸檔節點 Archive Node」</strong>三大類。我們將逐一來進行介紹。</p><h3>全節點 Full Node</h3><p>全節點是擁有完整區塊鏈帳本資料的節點，具備獨立驗證的能力來確認交易之有效性。具體來說全節點主要在處理下列四件事：</p><ol><li>儲存所有歷史交易資訊，資料公開透明</li><li>監測礦工挖出來的新區塊，驗證其合法性後同步該區塊</li><li>監測區塊鏈網路中的新交易資訊，驗證每個交易的合法性</li><li>將驗證過的「交易／區塊資訊」廣播給全網路節點</li></ol><p>一個節點只要下載了完整且最新的區塊鏈資料，穩定運行驗證交易和同步區塊資訊，那它就是一個全節點了。由於每一個全節點都保有全網資料，所以即使其中部分節點出現問題，例如斷網或被駭客攻擊，都不會影響整個區塊鏈網路的安全性。這即是「去中心化」記帳系統的優勢所在。</p><p>同時，全節點的數量越多，也代表完整的區塊鏈帳本被保存的份數越多，「不可篡改性」也就越強，整個區塊鏈網路的安全性也隨之提升。一但有人企圖組織算力叛變，試圖改變區塊共識或發動雙花攻擊，其它正常運作的全節點可以即時驗證拒絕掉這些交易。</p><p>隨着持續增加的交易記錄與智慧合約部署，全節點所需的儲存空間也在不斷增長。截至 2020/05，<strong>以太坊全節點的資料大小已經超過 360 GB，並以每個月約 30 GB 的速度持續增長中。</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*URuknqxSw10jYhO4O88FIg.png" /><figcaption>圖片來源：<a href="https://etherscan.io/">https://etherscan.io/</a></figcaption></figure><h4>礦工節點</h4><p>挖礦的過程即是將驗證過的待處理交易打包成新區塊，並以電腦算力來計算 「nonce 值」，最先找到 nonce 值成功出塊並廣播的礦工會獲得區塊獎勵與所有交易之手續費（gas）作為報酬。</p><p>礦工必須要運行全節點才能即時瀏覽區塊鏈歷史資料進行交易驗證，再將驗證通過的交易進行打包。因此，<strong>所有礦工必定是全節點；然而全節點未必是礦工，</strong>運行全節點的人未必會花費電腦算力去參與新區塊 nonce 值的運算來爭取區塊獎勵。</p><h3>輕節點 Light Node</h3><p>輕節點顧名思義即是輕量級的節點，具體定義是不儲存或維護完整的區塊鏈副本，只儲存最小量的狀態來作為發送或傳遞交易訊息的節點。至於輕節點究竟儲存了哪些狀態，我們得先透過下圖瞭解以太坊的資料結構：</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*vvstXw73nDKDOZvv.png" /><figcaption>圖片來源：<a href="https://blog.ethereum.org/">https://blog.ethereum.org/</a></figcaption></figure><h4>Block Header and Body</h4><p>以太坊的每個區塊主要分為 Header 和 Body 兩個部分存儲，Body 即是交易列表；Block Header 則較為複雜，包含了前個區塊的 Hash、時間戳及挖礦難度等相關參數。</p><p>在 Block Header 中採用一種名為 Merkle-Patricia Trie (MPT) 的核心資料結構來儲存區塊鏈資訊，可以理解為把帳本分割成無數個小的資料塊，每個資料塊像是一棵樹中的無數葉片，而我們把每兩個相鄰的葉片合併成一個字串，並算出該字串的 Hash 值。如此過程經過無數次後，最終如同所有樹枝歸向一個樹幹一般，會得到一個包含了所有區塊資料的 Hash 值，稱為「Merkle Root」。</p><h4>輕節點資訊</h4><p><strong>全節點儲存了所有區塊的 Block Header 與 Body（交易列表），而輕節點只儲存最小量的狀態：即「區塊標頭 Block Header」</strong>，藉此大幅降低儲存空間的需求。截至 2020/05，以太坊主網上約有 1017 萬個區塊，而每個區塊標頭的大小約為 508 bytes，故輕節點的大小約為 4.8 GB。</p><h4>輕節點如何驗證交易</h4><p>由於割捨掉區塊的 Body，即所有歷史的交易列表，因此當輕節點需要驗證某個交易的合法性時，具體做法為：</p><ol><li><strong>向鄰近的全節點發起確認請求</strong></li><li><strong>全節點收到請求後提供所需相關資訊供驗證</strong></li></ol><p>需要向全節點請求的原因是：假設有一個合約執行的交易，那麼便必須要有該合約部署時的原始碼（位在 Contract Created 之交易中）。由於該交易位於某個區塊之 Body，故輕節點必須要向全節點請求該合約之相關資訊方能進行交易驗證。</p><h4>輕節點的特色摘要</h4><p>整體而言，輕節點大致上具備以下幾點特色：</p><ul><li><strong>只儲存每個區塊的區塊標頭 Block Header</strong></li><li>不一定保持隨時在線（獲取最新的 Block Header 資訊）</li><li>根據需求可以只保存與自己相關的交易內容</li><li>無法驗證大多數交易的合法性，只能驗證與自己相關交易的合法性</li><li>無法驗證新區塊的正確性</li><li>只能檢測到當前的最長鏈，但無法知道哪條是最長合法鏈</li></ul><p>由於輕節點必須要向全節點請求與交易驗證相關的 Block Body 資訊，那麼要怎麼知道全節點回傳的資訊是正確的呢？</p><p>這時就要回到以太坊的資料結構來談，前面提到輕節點為了減少儲存空間，而割捨掉 Block Body，僅保留作為驗證之用的 Block Header。由於存有已經驗證合法之 Block Header，因此當未來需要驗證相關交易時只要透過跟全節點請求相關的 Block Body 資訊即可進行驗證，不需要從頭驗證整個區塊。</p><h4>Block Header 與交易驗證</h4><p>輕節點能夠利用 Block Header 驗證交易的原因為： Block Header 中的 Merkle Root 即是由 Block Body 中的交易資訊經由雜湊演算法（Hash Algorithm）生成的「數位指紋（Digital Fingerprint）」，因此 Block Header 可以充分代表 Block Body 內的資訊。</p><p>Block Header 中的 Merkle-Patricia Trie 是一個生成 Hash 需要花費大量算力，但驗證非常迅速的結構。<strong>當輕節點收到全節點提供的資訊時，便能夠利用已有的 Block Header 相關訊息迅速驗證該資訊是否正確，進一步進行交易驗證。</strong></p><p>介紹完全節點與輕節點後，最後我們來介紹 Archive Node，即歸檔節點。</p><h3>歸檔節點 Archive Node</h3><p>「歸檔節點」是在全節點的基礎之上，<strong>額外儲存了每個區塊高度的區塊狀態（個人帳戶與合約帳戶之當時餘額等資訊），即針對每個區塊高度當下的狀態進行快照並存檔。</strong>歸檔節點能讓你<strong>快速回到某個區塊高度去查詢當下狀態</strong>：例如你想要知道某一個帳戶在區塊高度 #5,000,000 的餘額時便會派上用場。</p><p>歸檔節點截至 2020/05 的資料大小已經超過 4 TB，對硬體要求相當龐大。通常只有特殊的服務如「區塊鏈瀏覽器：Etherscan」或「RPC Endpoint Provider：Infura」等底層服務會有架設歸檔節點的需求，大多數的情況全節點已非常足夠。</p><h4>歸檔節點與安全性</h4><p><strong>歸檔節點對於區塊鏈的信任模型與整體安全性原則上「不會有額外的加成或影響」，全節點（包含挖礦節點）已能充分保障全網路的安全。</strong>然而如果沒有人繼續維護歸檔節點的話，查詢區塊鏈上的歷史資料得花費許多的時間。Archive Node 保存了區塊鏈上的完整歷史紀錄與資料，以及所有區塊高度的當時全網狀態。</p><p>截至 2020/05，以太坊全網的歸檔節點總數量約為 100 個。</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*cF-2BPlXRRNUjdGv_YVFJw.png" /></figure><p>最後，我們透過下方的圖表來綜覽三種節點之異同：</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/920/1*yAMZARFja4A0MuUZciTzOw.png" /></figure><h3>結論</h3><ol><li>在以太坊網路中，節點大致可被分為<strong>「全節點 Full Node」、「輕節點 Light Node」、「歸檔節點 Archive Node」</strong>三大類。</li><li>輕節點（Light Node）<strong>僅儲存了區塊標頭 Block Header</strong>，沒有儲存 Body。當需要驗證交易時會<strong>向鄰近的全節點發起相關資訊請求</strong>以進行驗證。</li><li>歸檔節點（Archive Node）即在全節點基礎之上多<strong>儲存了每個區塊高度的狀態（State）快照</strong>，供檢索相關用途。</li></ol><p>介紹至此，讀者應該對於節點有初步的認識。未來，我將在這基礎之上<strong>進行以太坊 2.0 上線前的過度階段「以太坊 1.X」相關介紹</strong>，敬請期待！</p><p>以上，若有任何</p><p><strong>A. 我寫得不夠清楚的地方<br>B. 撰寫上改進的建議<br>C. 希望我能夠撰寫分享的區塊鏈技術知識內容</strong></p><p>都非常歡迎在底下留言回覆。希望我的文章能幫助到更多像我一樣想學習區塊鏈技術與知識的朋友。如果您覺得讀完有所收穫，也希望能</p><ul><li><strong>給我 50 claps</strong></li><li><strong>分享給您的朋友們</strong></li></ul><p>謝謝大家！</p><p>也歡迎大家閱讀區塊鏈技術知識系列的<a href="https://medium.com/pelith/blockchain-technical-overview-8c2a643424fa?source=friends_link&amp;sk=d5215878afe5e224f288ef8fb7156329">其它篇文章</a>：<br><a href="https://medium.com/pelith/blockchain-technical-overview-8c2a643424fa">https://medium.com/pelith/blockchain-technical-overview-8c2a643424fa</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=d3e07745d189" width="1" height="1" alt=""><hr><p><a href="https://medium.com/pelith/ethereum-nodes-d3e07745d189">全節點與輕節點：以太坊節點面面觀 &lt;10&gt; 文組也該知道的區塊鏈技術知識</a> was originally published in <a href="https://medium.com/pelith">Pelith</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[淺談預言機 Oracle：區塊鏈與現實世界的橋樑。<9> 文組也該知道的區塊鏈技術知識]]></title>
            <link>https://medium.com/pelith/oracle-a2016c17a56f?source=rss-c5fae3649355------2</link>
            <guid isPermaLink="false">https://medium.com/p/a2016c17a56f</guid>
            <category><![CDATA[ethereum]]></category>
            <category><![CDATA[course]]></category>
            <category><![CDATA[oracle]]></category>
            <category><![CDATA[technology]]></category>
            <category><![CDATA[blockchain]]></category>
            <dc:creator><![CDATA[Vins Lai @vins.ton]]></dc:creator>
            <pubDate>Thu, 02 Jan 2020 10:48:18 GMT</pubDate>
            <atom:updated>2020-06-03T09:31:18.967Z</atom:updated>
            <content:encoded><![CDATA[<h4>Blockchain Technical Overview &lt;9&gt; Oracle: The Bridge Between Blockchain and Real World</h4><blockquote><em>收看本系列文章的讀者，應該都對於區塊鏈的基本原理和架構有些概念，如果沒有，推薦您先去 Google 搜尋 </em><strong><em>區塊鏈、比特幣、以太坊</em></strong><em>這些關鍵字了解一下。我們將在這些基礎概念之上，來談區塊鏈的技術知識。本系列文章並不會談到太深的技術鑽研，而是希望以</em><strong><em>深入淺出</em></strong><em>的方式讓每一個想要搞懂區塊鏈技術的人都能在讀完後說出：</em><strong><em>原來如此！</em></strong></blockquote><blockquote><em>本系列文章由區塊鏈技術解決方案開發公司：</em><strong><em>Pelith</em></strong><em> 編撰。內容皆經過諸位區塊鏈資深研究員及開發者</em><strong><em>校對與驗證</em></strong><em>，盡可能確保</em><strong><em>內容正確無誤</em></strong><em>，讓讀者能安心吸收</em><strong><em>正確的區塊鏈技術知識</em></strong><em>。</em></blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Zuu-PJQZMFfpe0yrB9mmSA.png" /></figure><p><a href="https://medium.com/pelith/transferoferc20token-16a04e1ee73?source=friends_link&amp;sk=06283189338913e37efa80191de3d889">上一篇</a> 我們解析了「為何發送 ERC20 Token 需要兩次交易」，本篇文章將用較長的篇幅來帶大家完整認識 <strong>預言機 Oracle：區塊鏈與現實世界的橋樑。</strong></p><p>2019 年普遍被認為是屬於 DeFi 的一年。然而，隨著各式去中心化金融應用的蓬勃發展，背後不可忽視的議題：<strong>「Oracle」</strong>也逐漸被重視。</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ZkyNz6nAe1CRbnl1gEEdcg.png" /><figcaption>來源：<a href="https://consensys.net/blog/news/2019-was-the-year-of-defi-and-why-2020-will-be-too/">CONSENSYS News</a></figcaption></figure><h3>什麼是 Oracle？</h3><p>我們從《精通以太坊》的定義來看：</p><blockquote>《精通以太坊（Mastering Ethereum）》Chapter 11: Oracles</blockquote><blockquote>Oracles provide a crucial service to smart contracts: they <strong>bring external facts to contract execution.</strong><br>（翻譯）Oracle 為智慧合約提供關鍵的服務：<strong>把外部事實帶進合約中執行</strong>。</blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*yl2BMvbLEwAqJSEDqq2CRg.png" /><figcaption>Oracle 概念示意圖</figcaption></figure><p>在進入本文之前，想先問讀者一個問題：</p><blockquote>「要如何設計一個讓智慧合約取得鏈外資訊的方法？」</blockquote><p>希望讀者在閱讀本文之前都能先來思考看看，假設區塊鏈上的智慧合約需要區塊鏈外部的資訊來觸發與執行，那麼我可以如何做到這件事呢？這個架構的設計會長什麼樣子？有哪些決定性的細節？</p><p>好，接著我們進入本文的脈絡：</p><h4>為什麼區塊鏈需要 Oracle？</h4><p>由於區塊鏈是一個封閉的系統環境，目前區塊鏈只能獲取到鏈內的數據，而無法獲取鏈外真實世界的數據。</p><p>本質上來說，智慧合約即寫好了條件和結果的程式碼，當特定條件被給予或滿足時即能夠觸發。而若智慧合約執行需要的觸發條件是區塊鏈外部的訊息時，就必須要依靠 Oracle 提供數據，透過 Oracle 將現實世界的數據輸入到智慧合約中。</p><p>因為智慧合約只能被動接收數據，無法主動去獲取鏈外的數據，這就是區塊鏈需要 Oracle 的原因。</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*0AYhg2qZVG9QElxlSwLhVA.png" /><figcaption>Oracle 示意圖 (<a href="https://www.allcryptowhitepapers.com/wp-content/uploads/2018/05/ChainLink.pdf">ChainLink Whitepaper</a>)</figcaption></figure><h3>Oracle 的實際應用情境</h3><p>Oracle 作為現實世界數據與區塊鏈的橋樑，各式各樣的區塊鏈應用都需要 Oracle 提供外部數據。例如：穩定幣、借貸平台、金融衍生品交易平台、預測市場、博弈遊戲、保險等。</p><h4>博弈遊戲與隨機數</h4><p>我們首先來談為什麼「博弈遊戲」需要 Oracle。無論是拉霸、撲克牌、柏青哥等各樣的博弈遊戲都有個核心：「隨機性」，由於在區塊鏈上的隨機數都是可以被預測和破解的，因此一種可行的方式是依靠 Oracle 從外部餵給智慧合約不可預測的隨機數。</p><h4>智慧合約保險與理賠</h4><p>區塊鏈上的智慧合約保險也是，假設某間公司推出了透過智慧合約執行的車禍保險，究竟有沒有發生車禍、情節嚴重性及應理賠金額其實都必須要靠人來定奪並透過 Oracle 從外部餵入資訊給智慧合約才能觸發理賠執行。</p><h4>去中心化金融與即時價格資訊</h4><p>最常見且大宗的應用莫過於「DeFi」相關領域。各式各樣與加幣貨幣幣價或現實世界中的金融產品相關的應用前仆後繼被推出，而這些金融應用不可或缺的<strong>「即時價格資訊」</strong>便是存在於區塊鏈外的現實世界當中，必須仰賴 Oracle 來將資訊餵入區塊鏈（智慧合約）當中。</p><p>光是說明可能不夠清楚，我們實際來看一些牽涉 Oracle 的大型專案案例：</p><h3>去中心化美元穩定幣「DAI」的 Oracle 實作</h3><p>（以舊版的 DAI： Single Collateral DAI －現名 SAI 來作說明）</p><p>不可諱言，在 DeFi 世界中最重要的 Oracle 即 MakerDAO 的 ETHUSD 價格 Oracle，廣大的去中心化金融應用生態系都圍繞著 MakerDAO 與 DAI 開展。<br>(截至 2020/01，DeFi 總市值約 7 億美元；MKR 總市值約 5 億美元；DAI 總市值約 1 億美元)</p><p>儘管「MKR/DAI 的代幣對」與「DAI 的抵押生成機制：CDPs (Collateralized Debt Positions)」都是完全去中心化地進行，但整個 MakerDAO 系統仍有一個重大的潛在罩門：<strong>系統需要仰賴一個「Oracle」提供準確的 ETHUSD 即時幣價資訊</strong>。</p><blockquote>註：舊版 DAI (SAI) 的抵押生成需參照 ETH 的即時幣價。假設 ETH 幣價為 150USD，則抵押一顆 ETH 最多可以生成 100 顆 DAI，抵押品的價值必須大於鑄造 DAI 的 150%，亦即幣價一但跌到 149USD 便會觸發清算機制。</blockquote><blockquote>由於幣價資訊來自區塊鏈外部（<a href="https://coinmarketcap.com/">CoinMarketCap</a> 即為諸多交易所之加權平均現價）因此 MakerDAO 的智慧合約必須從區塊鏈外部不斷獲取即時幣價資訊以利 CDPs 與清算作業的進行。<a href="https://makerdao.com/en/whitepaper/">《MakerDAO Whitepaper》</a></blockquote><p>我們馬上來一探究竟牽動整個 DeFi 生態系的 MakerDAO Oracle 如何實作：</p><h4>MakerDAO 的 Oracle 架構</h4><p>MakerDAO 智慧合約系統運行所需要的 ETHUSD 幣價是透過一個名為「Medianizer」的 Oracle 智慧合約來提供；Medianizer 獲取最新幣價資訊的方式是藉由 14 個相互獨立的外部「Price Feed」單位通過智慧合約輸入。</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*uljBEzLVIv25LVe8Gmu5Ig.png" /><figcaption>MakerDAO Oracle 架構示意圖</figcaption></figure><h4>幣價的即時更新方式</h4><p>14 個「Price Feed」會隨時監控 MakerDAO 官方公告的「<a href="https://makerdao.com/en/feeds/">先前共識價格</a>」，並在每當：</p><ol><li>「ETH 最新時價」與官方公告的「先前共識價格」有一定比例差距時（目前定為 1%）</li><li>距離上一次的價格更新已經超過 6 個小時</li></ol><p>以上兩個情況時，「Price Feed」將提交最新的幣價資訊給 Medianizer。</p><p>Medianizer 收到多個新幣價資訊後，將會取「所有收到幣價的中位數」作為新的「共識價格」並輸入 MakerDAO 生態系的智慧合約中。這樣的共識機制只要有超過 50% 的「Price Feed」提供正確資訊系統便能維持安全穩定。<br>（至多 6 個「Price Feed」相互串通餵入錯誤幣價資訊時將不會影響最終的共識價格，即未達 <strong>51% 攻擊</strong>）</p><p>至於這 14 個「Price Feed」究竟是何方神聖？<br>為什麼他們願意發送交易為 MakerDAO 提供幣價呢？<br>讓我們繼續看下去！</p><h3>MakerDAO 的 Oracle 生態系運行</h3><p>MakerDAO 的獨特之處在於它是一個 <strong>去中心化自治組織（D.A.O. — Decentralized Autonomous Organization）</strong>，從穩定幣 DAI 的發行乃至 Oracle 都有設計去中心化的機制來運行。</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*IL3jmevj2-iu7BTjEZcqWQ.png" /><figcaption>MakerDAO Oracle 生態系中不同的角色關係（<a href="https://blog.makerdao.com/introducing-oracles-v2-and-defi-feeds/">MakerDAO Blog</a>）</figcaption></figure><h4>Price Feeds</h4><p>為 MakerDAO 生態系提供幣價資訊的<strong>「Price Feeds」</strong>將獲得 DAI 作為報酬，以此獎勵它們的服務並阻擋它們行惡意行為的意圖。<br>（註：目前的 DAI 獎勵是由 <a href="https://etherscan.io/token/0x9f8f72aa9304c8b593d555f12ef6589cc3a579a2?a=0x8ee7d9235e01e6b42345120b5d270bdb763624c7">Maker Development Fund</a> 基金資助，MakerDAO 規劃未來獎勵將從 Maker Protocol 的 stability fees 提撥。）</p><p>而 Price Feeds 的真面目其實是由 MKR Token 持有者投票決選出的 <strong>14 個白名單地址</strong>（已知部分為大型交易所）。</p><p><strong>表現好的地址</strong>（有持續、準時為 MakerDAO 提供正確幣價資訊）將能夠留在白名單中賺取獎勵報酬；</p><p><strong>表現不好的地址</strong>（偷懶沒有提供幣價資訊或提供錯誤幣價資訊）則可能馬上被 MKR Token 持有者們罷免汰換掉。</p><h4>小結</h4><p>以上便是核心版的 MakerDAO Oracle 生態系解析，為了避免篇幅過長及便於閱讀，有省略了部分細節。有興趣更深入了解的朋友可以在上方篇幅中的底線處找到 reference 連結。</p><p>介紹完 MakerDAO 獲取 ETHUSD 幣價資訊的 Oracle 實作方式後，可以發現 MakerDAO 需要 Oracle 餵入的是相對單純的「ETHUSD」單一資訊。然而，假設需要的是更多種類的資訊，例如：在區塊鏈上打造一個去中心化的預測市場，該如何將「球賽勝負」或是「選舉結果」等資訊餵入區塊鏈呢？</p><p>緊接著我們來介紹另一個有趣的 Oracle 實作項目：</p><h3>為去中心化預測市場而生的 Oracle: <a href="https://www.augur.net/">Augur</a></h3><p>Augur 是一個架構上有些複雜的預測市場平台，我們試著長話短說精要核心地介紹它。</p><p>每個人都可以在 Augur 上創建預測市場，而預測市場簡單來說就是提出一個「是非題」或是「選擇題」。我們實際透過一個範例來瞭解 Augur 的實作流程，「假設」有人在 Augur 上開立一個預測市場題目：</p><p><strong>「2020 年台灣總統大選的當選人會是？A. 宋O瑜、B. 韓O瑜、C. 蔡O文」</strong></p><p>直到 2020 年 1 月 11 日選舉結果出爐前，任何人都能夠在 Augur 上針對三個選項進行下注（投入以太幣）。</p><p>當結果出爐時，創建這個預測市場的人必須作為 Oracle 去將選舉結果回報給智慧合約以進行清算。</p><p>如果回報的結果是正確的，那麼本盤預測市場將在經歷一段 <strong>異議提出期間（3–10 天）</strong>的等待後完成清算，就此結束。</p><p>然而，若回報的是 <strong>錯誤的結果</strong>（例如：A. 宋O瑜當選，卻回報 B. 韓O瑜），或者是有人 <strong>對於技術細節有不同意之處</strong>（例如：1 月 11 日當天電視台已經開始開票了卻還能在 Augur 上下注）。那麼想提出異議的人能透過抵押部分的 <strong>Augur 平台治理代幣「REP」</strong>至其它的結果來進入「爭論期間」。</p><p>接著，其他的 REP Token 的持有者將作為這盤預測市場的「裁判」來投票：究竟哪個結果才是正確的？</p><p>系統會將獲得最多票數的結果視為正確結果，所有投票給正確結果的 REP Token 持有者將可以獲得獎勵，投給其它結果的人將不會獲得。<br>（投票結果出爐後仍然會有一段提出異議的期間，如果無異議將清算結束；若是有人想提出異議需要抵押更多的 REP Token 展開新一輪的投票。）</p><p>這樣的流程大致上如同下方這張官方製作的流程圖所示：</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*-HVOe7qlt0OHi2gy2AfyzQ.jpeg" /><figcaption>Augur 預測市場實作流程示意圖（<a href="https://medium.com/@AugurProject/augur-weekly-development-update-june-6th-e04d67a6ae68">Augur Medium</a>）</figcaption></figure><p>至此，我們便核心地介紹完了 Augur。總結來說，</p><ol><li>在 Augur 上創建預測市場的人將作為 Oracle。</li><li>REP Token 的持有者將作為裁判，檢視提出異議的預測市場並確保 Oracle 回報的是真實的結果。</li></ol><p>Augur 透過這樣的獎勵機制將能讓平台變得更加值得信賴與可靠，對當中許多的技術實作細節有興趣更深入瞭解的朋友可以參考官方的 <a href="https://www.overleaf.com/read/wchttdcjvjjq">白皮書</a>。</p><p>最後，我們來介紹以太坊上的第一個嘗試提出的去中心化 Oracle 解決方案：</p><h3>去中心化 Oracle 網路：Chainlink</h3><p>有別於 Augur 透過「挑戰機制」處理中心化 Oracle（個人）餵入錯誤資訊的問題。Chainlink 試圖解決 Oracle 餵入錯誤資訊的方式是導入一個由去中心化 Oracle 網路組成的<strong>「中介層：Chainlink Nodes」</strong>。</p><p>比起由 Chainlink 這個組織本身提供數據資訊會造成的中心化信任問題，Chainlink 整合了從不同數據來源獲取數據的眾多「Data Feeds（數據提供者）」來提供一個共識過的「數據資訊」，有些相似於 MakerDAO 的共識機制。</p><h4>Chainlink 的 Oracle 實作方式</h4><p>Chainlink 透過鏈上的「Oracle 智慧合約」與鏈外的「Chainlink 節點」實現去中心化的架構。假設鏈上的一個「DeFi DApp（智慧合約）」想要透過 Chainlink 取得 CoinMarketCap 的幣價資訊，那麼取得資訊的流程大致上是如下圖所示：</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*FhmlG3cUwM3cEDUxbOZD9Q.png" /><figcaption>Chainlink 架構示意圖（完整的實作流程如下方所述）</figcaption></figure><h4>Chainlink 的 Oracle 實作流程</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*bNSY2ShXmAnVl4NsnS3Ffw.png" /><figcaption>Chainlink 實作流程圖（<a href="https://www.allcryptowhitepapers.com/wp-content/uploads/2018/05/ChainLink.pdf">Chainlink 白皮書</a>）</figcaption></figure><ol><li>用戶的智慧合約（DeFi DApp）發起一個鏈上的請求；</li><li>Chainlink 的智慧合約收到請求後在鏈上記錄下這個請求的內容；</li><li>Chainlink 節點內的「區塊鏈接口（Core）」抓取這個請求內容並發送給對應「外部接口（Adapter）」；</li><li>「外部接口」按請求內容至外部 API（CoinMarketCap）取得數據資訊；</li><li>「外部接口」將數據格式整理完成後派送給「區塊鏈接口」；</li><li>「區塊鏈接口」將數據資訊回報給 Chainlink 智慧合約；</li><li>Chainlink 智慧合約將一至多個節點回傳的數據資訊進行一次共識並發送結果給用戶智慧合約。</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*BsozLP1EoA5INYjWeIAlKg.png" /><figcaption>Chainlink 在<strong>「Chainlink 節點」</strong>與<strong>「外部數據資訊來源」</strong>兩個層面都透過分散式的架構減低資訊錯誤的風險（<a href="https://www.allcryptowhitepapers.com/wp-content/uploads/2018/05/ChainLink.pdf">Chainlink 白皮書</a>）</figcaption></figure><h4>Chainlink 的節點網路 Oracle 架構</h4><p>Chainlink 的架構核心即為<strong>由許多的數據提供者組成的鏈外「Chainlink 節點網路」</strong>，想要成為在 Chainlink 網路中提供數據的節點必須要抵押特定量的 Chainlink 平台治理代幣「LINK」Token。使用者如果想要透過 Chainlink 來取得數據資訊時需要以 LINK 來支付費用，而這些 LINK 將會分配給提供正確數據資訊的節點們作為報酬。而提供錯誤資訊或是有其它異常行為的節點將會被扣除部分抵押的 LINK 作為懲罰。</p><p>透過這樣的方式，去中心化的 Chainlink Oracle 網路試圖透過<strong>抵押與獎懲機制</strong>來提供一個比起中心化的 Oracle 在架構上更加穩定的解決方案。</p><h3>Oracle 與經濟學上的「賽局理論 Game Theory」</h3><p>介紹至此，相信大家都對於 Oracle 有了基礎的概念與認識，各式各樣的 Oracle 架構要解決的都是同一個問題：<strong>「如何『安全地』把鏈外的『正確』資訊送入鏈上的智慧合約中」</strong>。而之所以要強調「安全」與「正確」，即是為了盡可能減少 Oracle 餵入錯誤資訊的動機，或是增加這麼做的成本。怎麼說呢？</p><p>我們再回到前述提到的台灣總統大選預測市場的案例來說明：<br><strong>「2020 年台灣總統大選的當選人會是？A. 宋O瑜、B. 韓O瑜、C. 蔡O文」</strong></p><p>假設這個預測市場是透過呼叫 Chainlink 來取得外部 API 資訊，而我恰好是營運 Chainlink 節點來提供這個數據資訊的人，且又剛好在 Chainlink 上只有我一個節點有提供台灣總統大選結果的 API。</p><p>假設這個預測市場中 A. 宋O瑜 的賠率最高。這邊會出現一個有趣的<strong>賽局（Game）</strong>：</p><p>如果我預期我能在這個預測市場中從 A. 宋O瑜 選項獲得的報酬價值多過我所抵押的 LINK Token 總價值，那麼我便有十足的誘因去<strong>「重注下在 A. 宋O瑜 選項上」</strong>。並在選舉結果出爐後，這個預測市場呼叫我的節點來提供數據資訊時<strong>「故意回報錯誤的 A. 宋O瑜 當選資訊」</strong>，藉此來賺取報酬。即使 Chainlink 後續發現我回報了錯誤的資訊而扣押了我所抵押的 LINK Token 作為懲罰，但我經由回報錯誤的外部資訊賺取了更高額的報酬。</p><p>透過上述的說明我們可以發現 Oracle 要解決的其實不只是技術問題，更重要的是<strong>「經濟學問題」</strong>。無論是 MakerDAO、Augur 或是 Chainlink，其實區塊鏈外部的資訊最終都仍是由「人」來回報給區塊鏈。因此，一個好的 Oracle 應該要具備以下的特性：</p><h4>「隨著市場規模的擴大，Oracle 的攻擊成本也要相應的提升」</h4><p>無論是球賽賭盤、保險、預測市場等各式各樣需要仰賴 Oracle 來提供外部數據資訊的服務，參與者都必須要有所認知：<strong>「一但餵入錯誤資訊的預期獲利大於成本，Oracle 就有十足的動機來這麼做，因此這個 Oracle 即處在不安全的狀態中。」</strong></p><p>我們在參與去中心化金融與各式的區塊鏈應用時，除了注意如何操作、好不好用，當產品或平台牽涉到區塊鏈外部的資訊時，我們更應該注意這個專案的 Oracle 實作方式。</p><p>若是一個預測市場或賭盤的 Oracle 成本不會隨著賭盤總投注資金的上升而讓攻擊成本上升，那麼這個 Oracle 便存在著結構性風險。一但 Oracle 餵入錯誤資訊的成本小於能夠從賭盤獲得的利潤，將讓平台陷入 Oracle 攻擊風險當中。</p><p>在</p><h3>各大專案的 Oracle 實作方式解析</h3><p>我們實際帶大家來看幾個有牽涉到區塊鏈外部資訊的平台 Oracle 實作方式：</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*B1LVpr0WLEOaH5GJ90mAzw.png" /></figure><h4>去中心化借貸平台 <a href="https://compound.finance/">Compound</a> 的 Oracle 實作</h4><p>首先我們來看看大家最熟悉的「去中心化當鋪」：<a href="https://compound.finance/">Compound Finance</a>，槓桿交易的操作員可以透過在 Compound 上抵押借貸資產來做多或做空。而 Compound 需要仰賴 Oracle 來獲取<strong>即時的幣價資訊</strong>更新抵押率以進行清算。雖然號稱 <a href="https://medium.com/compound-finance/announcing-compound-open-oracle-development-cff36f06aad3">新版的 Oracle</a> 即將推出，不過截至撰文當下仍尚未啟用，應仍是以白皮書上記載的舊版架構來營運。</p><p>我們直接來看 <a href="https://compound.finance/documents/Compound.Whitepaper.pdf">Compound Whitepaper</a> 上的論述：</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*gVSWv0yWGqInr8vXsZ8VMw.png" /></figure><p>大意：Compound 的 Price Oracle 會從前十大交易所抓取幣價資訊並進行整合。根本來說仍然是由 Compound 團隊以中心化的方式來實作。</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*l7mudy9iOwvUEpbY3PMdvA.png" /></figure><h4>去中心化合成資產平台 <a href="https://www.synthetix.io/">Synthetix</a> 的 Oracle 實作</h4><p>接著看到 Synthetix：以太坊上的去中心化合成資產發行協議，同時也是全世界 DeFi 領域總市值第二大的平台（<a href="https://defipulse.com/">截至 2019.12.31 約有價值 1.7 億美元的加密貨幣資產投入該平台，僅次於 MakerDAO</a>）。透過抵押平台幣 SNX 可以發行出各樣的虛擬資產，如：法幣（美元、歐元、日幣等）、商品（金、銀、石油）、虛擬貨幣（BTC、ETH）等。</p><p>Synthetix 需要透過 Oracle 不斷餵入即時外部資訊來追蹤這些商品的時價，讓投資者不必真的持有外幣或黃金，也能參與這些投資標的的漲跌幅。而這樣需要眾多即時且大量外部資訊平台的 Oracle 究竟如何實作呢？我們可以在官方文件 <a href="https://www.synthetix.io/uploads/synthetix_litepaper.pdf">Synthetix Litepaper</a> 中找到相關論述：</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*N44sYr0ORThyZ-UlFNwTNw.png" /><figcaption>Synthetix 的 Oracle 實作</figcaption></figure><p>大意是：Synthetix 的 Oracle 是由 Synthetix 的官方團隊來運作，透過演算法抓取多個數據來源整合（就是 Synthetix 團隊中心化來處理）。然而，最後提到<strong>有規劃在未來將把 Oracle 給去中心化</strong>，就在 2019 年 12 月 18 日，<a href="https://blog.synthetix.io/chainlink-decentralizes-first-wave-of-synthetix-price-feeds/">官方宣佈了與 Chainlink 合作的消息</a>，未來將會透過 Chainlink 來為 Synthetix 上的各樣合成資產即時報價。</p><p>最後，我們來看另一個同樣牽涉到 Oracle 的以太坊社交博弈平台：<a href="https://bethereum.com/">Bethereum</a>。</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*sZ2Sdnl0P034UoU363eSIw.png" /></figure><h4>去中心化運動博弈平台 <a href="https://bethereum.com/">Bethereum</a> 的 Oracle 實作</h4><p>如果你有玩過 PTT 上的樂透，那你就知道它在玩什麼。簡而言之就是體育與電競賽事的博弈，與運彩不一樣的地方在於 Bethereum 上的賠率不是由莊家訂定，而是由所有的下注者共同決定的。用一場 NBA 比賽做範例說明：「2019/12/25 快艇 vs 湖人」，比賽結果只會有兩個選項「A. 湖人贏、B. 快艇贏」，當下注湖人贏的總額變多時，湖人贏的賠率就會下降；而快艇贏的賠率會上升。</p><p>好，Bethereum 平台怎麼玩不是重點（抱歉離題），重點是當這場比賽的打完，結果出爐後（快艇贏），必須要靠 Oracle 來將比賽結果資訊給餵入區塊鏈智慧合約中，好讓所有下注的總額能按比例平分給正確下注快艇贏的玩家。同樣我們可以在官方的 <a href="https://www.bethereum.com/Bethereum-Whitepaper-EN.pdf?v=04">Bethereum Whitepaper</a> 中找到 Oracle 的說明：</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*LdsK6l0eKtchfv3Vmwu9SA.png" /></figure><p>大意：Bethereum 獲取鏈外資訊的 Oracle 實作方式是會從多個數據來源搜集有效數據（反正就是 Bethereum 平台中心化處理）。不過最後有提到若結果有爭議將會退盤，也意味著在智慧合約中仍留有後門可供人操作。</p><h3>結論</h3><h4>1. 中心化 Oracle 與信任議題</h4><p>可以看到在上述三個案例中（Compound、舊版 Synthetix、Bethereum），Oracle 都是由平台方中心化地來處理，對於使用者而言其實仍然存在一定程度的風險。根本來說<strong>使用者必須相信平台為了平台名譽不會亂搞（餵入假的數據資料）</strong>。然而，如此便又回到了中心化的問題當中，使用者<strong>信賴的對象仍然是「平台營運方」</strong>，而非架構本身，實是<strong>有違去中心化的精神與真諦</strong>。</p><h4>2. 觀察專案的 Oracle 實作方式</h4><p>在瞭解什麼是 Oracle 之後，未來在參與去中心化金融與各式的區塊鏈應用時，除了注意平台如何操作、介面好不好用、能如何賺錢套例外，<strong>當平台牽涉到區塊鏈外部的資訊時，我們更應該注意這個專案的 Oracle 實作方式</strong>，才不會讓自己的寶貴資產陷於風險當中。</p><p>若是一個預測市場或賭盤的 Oracle 不會隨著賭盤總投注金額的上升而讓攻擊成本上升，那麼這個 Oracle 便存在著結構性風險。<strong>一但攻擊 Oracle 餵入錯誤資訊的成本小於能夠從賭盤獲得的利潤，將讓 Oracle 陷入被攻擊的風險當中</strong>，任何人有權影響 Oracle 餵入資訊的人都會有十足的犯罪動機。</p><p>至此，相信大家都已正確建立對 Oracle 的認識，目前 Oracle 其實仍是個較新的議題，不過誠如本文論述主旨：</p><h4><strong>「Oracle 要解決的不只是技術問題，亦是經濟學問題」</strong></h4><p>許多的專家仍在著手研究提出更理想的 Oracle 架構。期許未來能看到更多樣化的 Oracle 解決方案。</p><p><a href="https://medium.com/pelith/ethereum-nodes-d3e07745d189?source=friends_link&amp;sk=f30a16455e43b692963e88860fd5eca1">下一篇</a>，我們將針對<strong>以太坊節點（Ethereum Nodes）</strong>做概論性的介紹，包含輕節點 Light Node、全節點 Full Node 與 歸檔節點 Archive Node，讓讀者能充分認識節點與其背後的運作機制。</p><h4>文章連結：</h4><p><a href="https://medium.com/pelith/ethereum-nodes-d3e07745d189?source=friends_link&amp;sk=f30a16455e43b692963e88860fd5eca1">全節點與輕節點：以太坊節點面面觀 &lt;10&gt; 文組也該知道的區塊鏈技術知識</a></p><p>以上，若有任何</p><p><strong>A. 我寫得不夠清楚的地方<br>B. 撰寫上改進的建議<br>C. 希望我能夠撰寫分享的區塊鏈技術知識內容</strong></p><p>都非常歡迎在底下留言回覆。希望我的文章能幫助到更多像我一樣想學習區塊鏈技術與知識的朋友。如果您覺得讀完有所收穫，希望能</p><p><strong>＊ 不吝嗇給我 50 claps<br></strong>（如果您覺得按 50 下手很痠，這邊剛好有個好用的：<a href="https://chrome.google.com/webstore/detail/medium-clap/nmjllpfdeipgjiboaagoiefdkalefnbe?hl=en-US">小插件</a>）<br><strong>＊ 分享本文給您的朋友們</strong></p><p>謝謝大家！</p><p>也歡迎大家來閱讀區塊鏈技術知識系列的<a href="https://medium.com/pelith/blockchain-technical-overview-8c2a643424fa?source=friends_link&amp;sk=d5215878afe5e224f288ef8fb7156329">其它篇文章</a>：<br><a href="https://medium.com/pelith/blockchain-technical-overview-8c2a643424fa">https://medium.com/pelith/blockchain-technical-overview-8c2a643424fa</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=a2016c17a56f" width="1" height="1" alt=""><hr><p><a href="https://medium.com/pelith/oracle-a2016c17a56f">淺談預言機 Oracle：區塊鏈與現實世界的橋樑。&lt;9&gt; 文組也該知道的區塊鏈技術知識</a> was originally published in <a href="https://medium.com/pelith">Pelith</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[文組也該知道的區塊鏈技術知識 <8> 為何發送 Token 需要兩次交易？]]></title>
            <link>https://medium.com/pelith/transferoferc20token-16a04e1ee73?source=rss-c5fae3649355------2</link>
            <guid isPermaLink="false">https://medium.com/p/16a04e1ee73</guid>
            <category><![CDATA[technology]]></category>
            <category><![CDATA[course]]></category>
            <category><![CDATA[blockchain]]></category>
            <category><![CDATA[token]]></category>
            <category><![CDATA[ethereum]]></category>
            <dc:creator><![CDATA[Vins Lai @vins.ton]]></dc:creator>
            <pubDate>Wed, 27 Nov 2019 07:41:17 GMT</pubDate>
            <atom:updated>2020-05-20T06:38:42.251Z</atom:updated>
            <content:encoded><![CDATA[<h3>為何發送 ERC20 Token 需要兩次交易？ &lt;8&gt; 文組也該知道的區塊鏈技術知識</h3><h4>Blockchain Technical Overview &lt;8&gt; Transfer of ERC20 Token</h4><blockquote><em>收看本系列文章的讀者，應該都對於區塊鏈的基本原理和架構有些概念，如果沒有，推薦您先去 Google 搜尋 </em><strong><em>區塊鏈、比特幣、以太坊</em></strong><em>這些關鍵字了解一下。我們將在這些基礎概念之上，來談區塊鏈的技術知識。本系列文章並不會談到太深的技術鑽研，而是希望以</em><strong><em>深入淺出</em></strong><em>的方式讓每一個想要搞懂區塊鏈技術的人都能在讀完後說出：</em><strong><em>原來如此！</em></strong></blockquote><blockquote><em>本系列文章由區塊鏈技術解決方案開發公司：</em><strong><em>Pelith</em></strong><em> 編撰。內容皆經過諸位區塊鏈資深研究員及開發者</em><strong><em>校對與驗證</em></strong><em>，盡可能確保</em><strong><em>內容正確無誤</em></strong><em>，讓讀者能安心吸收</em><strong><em>正確的區塊鏈技術知識</em></strong><em>。</em></blockquote><blockquote>為什麼發送 ERC20 Token 給別人需要兩次交易？</blockquote><p>許多人可能對此感到疑問，透過本篇文章相信能充分為您解惑。<a href="https://medium.com/pelith/structure-of-ethereum-blockchain-35fd4849f609?source=friends_link&amp;sk=55f628562d7b141555cf92f651bff957">上一節</a> 我們帶大家一窺以太坊的架構全貌並為迄今為止七篇文章做了小結。我們將在這基礎之上闡明發送 ERC20 Token 背後的技術解析。</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*_WfwcSa5xO62XDk_hzIzIg.png" /></figure><h4>發送以太幣</h4><p>發送以太幣時其實蠻符合我們的直覺，就是把錢發給別人，別人收到這樣。然而發送 ERC20 代幣卻彷彿不是這麼單純，為什麼呢？</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*11x5-TbpLRMJMS5J4XvHDg.png" /><figcaption>EOA 互動（發送 ETH）</figcaption></figure><h4>ERC-20 代幣的本質</h4><p>首先回顧一下 <a href="https://medium.com/pelith/structure-of-ethereum-blockchain-35fd4849f609?source=friends_link&amp;sk=55f628562d7b141555cf92f651bff957">上一節</a> 提到的，ERC20 代幣只是用 ERC20 之智慧合約底下的記憶體來儲存記錄各個地址持有數量的帳本。既然對象是個智慧合約，就要再回顧一下 <a href="https://medium.com/pelith/howethsmartcontractwork-328bd8b9bb62?source=friends_link&amp;sk=0a0653a532f922e62008e7a4679ee413">第二節</a> 提到的，個人帳戶（Externally Owned Account, EOA）與 合約帳戶（Contract Account）的不同，由於智慧合約沒有主觀意識，動作皆需要由 EOA 發交易來觸發。因此<strong>當合約地址收到 ETH 外的其它代幣時，它並不會知道</strong>。因為更動的是<strong>「另一個智慧合約底下的記憶體」</strong>！</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*YN-HbcZakzbtxuCLeqhMkA.png" /><figcaption>EOA 與 合約帳戶</figcaption></figure><h4>我們實際來看一個範例：</h4><p>假設我想要透過去中心化交易所 Uniswap 將我持有的 82 顆 cDAI 兌換成 0.0092 顆 ETH，在技術上是如何做到的呢？</p><blockquote><strong>先備知識：</strong>cDAI 是我將 DAI 存入 Compound 放貸後，Compound 發回給我的 ERC20 Token。所以 cDAI 是由 Compound 管理的 cDAI 智慧合約底下之記憶體（帳本）來記錄追蹤的。</blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*dihCTiqKvEVJaYyjdlFkVw.png" /><figcaption>Uniswap 的 Token Swap 介面</figcaption></figure><p>我的 Token Swap 需求在常規邏輯上是：<br>我把我的 cDAI token 發送給 Uniswap，Uniswap 把 ETH 發送給我。</p><p>不過事情並非這麼單純。由於<strong> Uniswap 是去中心化，由智慧合約來運作的。</strong>因此當 Uniswap 收到了 cDAI token 時，它不像人一樣可以點開 Metamask 去查看是否有收到，確認有收到後再把 ETH 發送給我，因此需要用特殊的做法來實現這樣的流程。</p><h3>我們就直接開門見山講答案</h3><p>用比喻來說明的話，做法是：</p><ol><li>我先到 <strong>銀行（ERC20 Token 的智慧合約）</strong>開啟 <strong>授權</strong>，<br>允許 <strong>對方（第三方智慧合約）</strong>能夠到我的戶頭<br>提取 <strong>錢（ERC20 Token）</strong>，並設定<strong>「能夠提取的額度」</strong>。</li><li>接著我開給對方一張<strong>「寫上金額的支票」</strong>，<br>讓對方拿著支票到 <strong>銀行 </strong>中提領我帳戶中的 錢。</li></ol><p>因為對象（智慧合約）是一段程式碼，如此做法方能 <strong>讓智慧合約確認提取到 Token 並執行後續的合約邏輯操作。</strong></p><p>因此，回到區塊鏈的世界，必須透過以下兩個交易步驟來進行：</p><h4><strong>Tx1: Approve（授權）</strong></h4><p>我必須先發一筆交易到「Compound cDAI Token 智慧合約」（銀行），<br><strong>授權「Uniswap 的 cDAI to ETH 交易對智慧合約」</strong>（對方）<strong><br>可以到「Compound 的 cDAI Token 智慧合約」</strong>（銀行）<br><strong>提取我的「cDAI Token」</strong>（錢）<strong>。</strong></p><h4><strong>Tx2: Swap Token（兌換）</strong></h4><p>隨後，我再發送一筆「將 cDAI 兌換為 ETH」的交易（支票）<br>到「Uniswap 的 cDAI to ETH 交易對智慧合約」（對方）觸發，<br>讓「Uniswap 的 cDAI to ETH 交易對智慧合約」（對方）<br>至「Compound 的 cDAI Token 智慧合約」（銀行）<br>提領我的 82 顆「cDAI Token」（錢）。<br>「Uniswap 的 cDAI to ETH 交易對智慧合約」（對方）提領到 Token（錢）後再將 0.0092 顆 ETH 發送給我。</p><blockquote>如下方示意圖所示：</blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*tFnesVwf1RayKiGoOxMDGg.png" /></figure><h4>接著我們帶大家實際走一次操作流程以搞懂背後技術邏輯。</h4><h3>Tx1: Approve（授權）</h3><p>首先，當我們來到 <a href="https://uniswap.exchange/swap">Uniswap</a> 交易所，選好 Input 與 Output 的加密貨幣種類並在 Input 輸入欲兌換的數量，便可以在我欲兌換成 ETH 的 cDAI Token 旁邊看到<strong>「Unlock」</strong>的按鈕。這就是要求我進行<strong>「Tx1：授權」</strong>的操作。</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*dihCTiqKvEVJaYyjdlFkVw.png" /></figure><p>點選「Unlock」按鈕後，Metamask 便會跳出<strong>「批准」</strong>的交易來讓我簽署。一但簽署後，我便<strong>批准了 Uniswap 能夠到 Compound 提領我的 cDAI </strong>的權限。</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*WdqQky-_4qSE-pl6WU_IBQ.png" /></figure><p>這筆交易被確認後，我們便可以憑 Txn Hash 到 Etherscan 上找到這筆交易。可以發現這筆交易是<strong>發給「Compound 的 cDAI ERC20 Token 智慧合約」</strong>。</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*GCLw4k8Xu-kHdG5F68esoQ.png" /></figure><p>點進去這筆交易後，便可以看到呼叫的正是 approve 的 function。我同意了「Uniswap 的 ETH-cDAI 交易對」合約地址能夠來提領我的 cDAI，而<strong>授權的提領金額量為「最大」</strong>。</p><p>可能會有些人好奇為什麼不把 amount 設成我要兌換的量：82 就好。原因是為了<strong>便利於未來提領操作時不用再次授權</strong>，通常呼叫智慧合約的 approve 函式時都會<strong>預設為開啟最大值</strong>，這樣未來再次需要提領時就不用再次進行 approve 的操作。</p><p>然而要注意的部分是：<strong>針對「可能存在漏洞或不被信任的智慧合約」</strong>，若是仍按照預設將權限開至最大值，則將<strong>面臨 Token 遭到竊取的風險。</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/980/1*uP_8o9LzNq5298YDxzCzRg.png" /></figure><p>在完成「Tx1：Approve 授權」後，便可以看到「Unlock」的按鈕消失，並且<strong>「Swap」</strong>按鈕已能夠點選。</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/720/1*9xa7VrjZy_ctUFOc8KtSpA.png" /></figure><h3>Tx2： Swap Token</h3><p>接著便能夠來進行將我的 cDAI 兌換成 ETH 的 Swap Token 動作。</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*S579LjRc9yJnFi-IqYWBjA.png" /></figure><p>同樣透過 Metamask 來簽署完成這筆交易後，我們到 Etherscan 上追縱這筆交易：能夠發現這筆交易是從我的錢包發送給<strong>「Uniswap 的 ETH-cDAI 交易對 智慧合約」</strong>。</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Yg-LWPHUy-wa6yI3WbKTXA.png" /></figure><p>點進去這筆交易後可以看到在這筆交易中執行了兩件事：</p><ol><li>將 82 cDAI 從「Compound 的 cDAI 智慧合約」轉至 「Uniswap 的 ETH-cDAI 交易對合約地址」中。</li><li>將 0.0092 ETH 從「Uniswap 的 ETH-cDAI 交易對合約地址」中轉給我。</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Rd2EI4ZjxTD1nTXHj7mR0w.png" /></figure><p>接著我們可以在「Uniswap 的 ETH-cDAI 交易對合約地址」的<br><strong>「Internal Txns」</strong>中看到 0.0092 ETH 轉移至我的錢包地址；以及<br>在<strong>「Erc20 Token Txns」</strong>中看到 82 cDAI 從「Compound 的 cDAI 智慧合約」轉移至「Uniswap 的 ETH-cDAI 交易對合約地址」中。</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*DZGJM0eqOU3Nm7DzL9ev1g.png" /></figure><p>同時，這筆交易在「Compound 的 cDAI 智慧合約」中也可以查看到 82 cDAI 被轉移出的記錄。</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*GVd4wNaWWrXfjqWrGbNcKw.png" /></figure><h3>結論</h3><ol><li>發送 ETH 與 發送 ERC20 Token 給智慧合約有本質上的差異。ETH 是 <strong>push-based</strong>，單純把 ETH 發過去就可以。ERC20 Token 的發送則是 <strong>pull-based</strong>，讓合約去主動提取 Token。</li><li>必須先發送一筆交易至 ERC20 合約進行 <strong>授權（Approve）</strong>，允許某合約地址能夠至 ERC20 智慧合約提取我持有的 ERC20 Token。</li><li>再發送一筆交易來觸發合約地址進行 <strong>提取 ERC20 Token</strong> 與後續的邏輯操作。</li></ol><p>至此，相信讀者都已充分理解發送 ERC20 Token 給智慧合約背後的技術邏輯。</p><p>下一節我們將來介紹<strong>「Oracle（預言機）」</strong>，這個扮演 <strong>真實世界與區塊鏈間橋樑 </strong>的技術，並帶大家認識 MakerDAO、Compound 等大專案的實作方式。敬請期待！</p><p>以上，若有任何</p><p><strong>A. 我寫得不夠清楚的地方<br>B. 撰寫上改進的建議<br>C. 希望我能夠撰寫分享的區塊鏈技術知識內容</strong></p><p>都非常歡迎在底下留言回覆。希望我的文章能幫助到更多像我一樣想學習區塊鏈技術與知識的朋友。如果您覺得讀完有所收穫，也希望能<br><strong>＊不吝嗇給我 Like / 50 claps<br>＊分享給您的朋友們<br></strong>謝謝大家！</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fbutton.like.co%2Fin%2Fembed%2Flaijack%2Fbutton%2F&amp;url=https%3A%2F%2Fbutton.like.co%2Flaijack&amp;image=https%3A%2F%2Fstorage.googleapis.com%2Flikecoin-foundation.appspot.com%2Flikecoin_store_user_laijack_main%3FGoogleAccessId%3Dfirebase-adminsdk-eyzut%2540likecoin-foundation.iam.gserviceaccount.com%26Expires%3D2430432000%26Signature%3DUFpz8RkTS%252FPM4LxQe9kKtpAnbs5WAgVdgjw91Hh6xXYviAAtDT2q9U1yoliTe881LuT%252FZtbgXCV8CjdWFYmj105e1%252Bk434yyzFhV3Yw5j8Po%252Bcin0lQQ7K5E13rwPUdN3vlAopvmZoWvG9GUIOY%252FrfPeWPLidhHNo0JRO%252FMJovmwA4C4GLao4v2AG%252FGBPMxtkK2wWyvgpopP9JhVtYqxFAamXr5RAbGd5CSdArfpK9GpqmytALhkDYvZ1RW%252BUf%252Fi7T17N7rTnhOKsmJ0mmMyTr4azasH8ewTh5ZxXE9CUb5f812gsleztbJvBs3ZXak1lwiDjWNdlJnpFIoVwpUi9Q%253D%253D&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=like" width="485" height="212" frameborder="0" scrolling="no"><a href="https://medium.com/media/eb8d8771f4ee83287095f9542ab9f5ad/href">https://medium.com/media/eb8d8771f4ee83287095f9542ab9f5ad/href</a></iframe><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=16a04e1ee73" width="1" height="1" alt=""><hr><p><a href="https://medium.com/pelith/transferoferc20token-16a04e1ee73">文組也該知道的區塊鏈技術知識 &lt;8&gt; 為何發送 Token 需要兩次交易？</a> was originally published in <a href="https://medium.com/pelith">Pelith</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[文組也該知道的區塊鏈技術知識 <7> 以太坊區塊鏈架構]]></title>
            <link>https://medium.com/pelith/structure-of-ethereum-blockchain-35fd4849f609?source=rss-c5fae3649355------2</link>
            <guid isPermaLink="false">https://medium.com/p/35fd4849f609</guid>
            <category><![CDATA[blockchain]]></category>
            <category><![CDATA[course]]></category>
            <category><![CDATA[ethereum]]></category>
            <category><![CDATA[blockchain-technology]]></category>
            <category><![CDATA[technology]]></category>
            <dc:creator><![CDATA[Vins Lai @vins.ton]]></dc:creator>
            <pubDate>Wed, 23 Oct 2019 08:44:56 GMT</pubDate>
            <atom:updated>2020-05-26T06:09:09.126Z</atom:updated>
            <content:encoded><![CDATA[<h3><strong>以太坊區塊鏈架構 </strong>&lt;7&gt; 文組也該知道的區塊鏈技術知識</h3><h4>Blockchain Technical Overview &lt;7&gt; Structure of Blockchain (Ethereum)</h4><blockquote>收看本系列文章的讀者，應該都對於區塊鏈的基本原理和架構有些概念，如果沒有，推薦您先去 Google 搜尋 <strong>區塊鏈、比特幣、以太坊</strong>這些關鍵字了解一下。我們將在這些基礎概念之上，來談區塊鏈的技術知識。本系列文章並不會談到太深的技術鑽研，而是希望以<strong>深入淺出</strong>的方式讓每一個想要搞懂區塊鏈技術的人都能在讀完後說出：<strong>原來如此！</strong></blockquote><blockquote>本系列文章由區塊鏈技術解決方案開發公司：<strong>Pelith</strong> 編撰。內容皆經過諸位區塊鏈資深研究員及開發者<strong>校對與驗證</strong>，盡可能確保<strong>內容正確無誤</strong>，讓讀者能安心吸收<strong>正確的區塊鏈技術知識</strong>。</blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*OQHw7NWfVRhjmZRFUw0twg.png" /></figure><p><a href="https://medium.com/pelith/structure-of-blockchain-daf85e06027e?source=friends_link&amp;sk=39ddaa60407081ed53baf714c1234d06">上一節</a> 我們帶大家核心地認識了區塊鏈架構的全貌，相信大家都更加了解區塊鏈運作的機制和原理。本篇文章我們將接續上篇來介紹 <strong>區塊鏈 2.0 以太坊－ </strong>Vitalik 如何在中本聰設計的比特幣架構上進行升級與改動，透過首度揭曉的<strong>「以太坊區塊鏈架構圖」</strong>帶大家完整認識以太坊的運作原理！</p><h4>區塊鏈 2.0－以太坊 Ethereum</h4><blockquote><em>本篇文章的內容會</em><strong><em>在前面幾章介紹過的概念之上接續進行介紹</em></strong><em>。若您未讀過前面幾章的內容可能會有些吸收不良，建議您</em><strong><em>先行閱覽再來閱讀本篇文章</em></strong><em>。<br>傳送門：</em><a href="https://medium.com/pelith/blockchain-technical-overview-8c2a643424fa?source=friends_link&amp;sk=d5215878afe5e224f288ef8fb7156329"><strong>《區塊鏈技術知識》目錄</strong></a><em> （建議您依序從 </em><a href="https://medium.com/pelith/%E6%96%87%E7%B5%84%E4%B9%9F%E8%A9%B2%E7%9F%A5%E9%81%93%E7%9A%84%E5%8D%80%E5%A1%8A%E9%8F%88%E6%8A%80%E8%A1%93%E7%9F%A5%E8%AD%98-1-%E5%BE%9E%E4%B8%80%E7%AD%86%E4%BA%A4%E6%98%93%E4%BE%86%E7%9C%8Beth%E8%88%87btc%E4%B9%8B%E7%95%B0%E5%90%8C-15704d74be2c?source=friends_link&amp;sk=75710c2f2a535072b5a535ea190ee2fd"><strong><em>第 1 節</em></strong></a><em> 閱讀至 </em><a href="https://medium.com/pelith/structure-of-blockchain-daf85e06027e?source=friends_link&amp;sk=39ddaa60407081ed53baf714c1234d06"><strong><em>第 6 節</em></strong></a><em>）</em></blockquote><h3>How Ethereum Blockchain Work</h3><h4>以太坊虛擬機（EVM — Ethereum Virtual Machine）</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*XlOEHZIgOJ8xuOxSsAvaJA.png" /><figcaption>智慧合約進到各節點之 EVM 執行示意圖</figcaption></figure><p>介紹以太坊區塊鏈架構前必須要介紹一下<strong>「EVM」</strong> ，EVM 是以太坊為了讓人人都能成為節點而創造的<strong>計算引擎</strong>。由於每個節點的軟硬體環境可能都不一樣，為了確保每個節能都能進行一樣的運算，於是各個節點都 <strong>透過 EVM 來執行 Ethereum 交易的狀態轉移與智能合約</strong>，以確保每一個節點都有相同的執行環境。</p><p>前言完畢，緊接著我們便來一探究竟：</p><h3><strong>以太坊交易的一生</strong></h3><p>有別於比特幣的 UTXO，以太坊是採用 Account 的架構。<br>由於以太坊多了智慧合約的設定，將會分成 A. B. C 三個 part 來做說明，<br>我們先從最單純的 Ether 轉帳交易開始看起：</p><h3>A. 單純的 Ether 轉帳交易</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Rpb0gvXoa7BWkB_YVKf5fQ.png" /><figcaption>「 單純的 Ether 轉帳交易 」示意圖</figcaption></figure><ol><li>一個使用者（EOA）欲發起一筆交易。</li><li>透過<strong>錢包</strong>（管理私鑰的工具）輸入交易資訊<br>To: 對方接收地址； <br>Amount: 欲轉移的 Ether 數量； <br>Gas Price: 單位 Gas 給的手續費；（參閱 <a href="https://medium.com/pelith/behindtheethtransaction-534dc6ce123e?source=friends_link&amp;sk=996607b64b68138c30efe7f1d3976986">第 5 節</a>）<br>Gas Limit: 普通的 Ether 轉移交易都是 21,000 Gas，不用動；<br>Input Data: 視是否要在交易中留下文字訊息。</li><li>以<strong>私鑰</strong>簽署交易。</li><li>廣播<strong>「加上簽名的交易封包」</strong>至鄰近的以太坊節點們。</li><li>節點接收到新交易時，會先至 State Database <strong>檢查交易發起地址是否具有足額 Ether（Balance）可做轉移</strong>，若無則該交易會即刻被丟棄。</li><li>若檢查後確認有足額，則該交易會被放入到 <strong>Tx Pool</strong> 中。<br>（按照 <strong>Gas Price 設的多寡</strong>由高至低排序）</li><li>等待出塊的同時，各節點會<br><strong>A. 廣播接收到的交易</strong><br><strong>B. 接收未在 Tx Pool 內的交易</strong></li><li>礦工節點們（有在用電腦算力找 nonce 值，拼出塊獎勵的節點）會<strong>撈取手續費較高的交易們，進到 EVM 運算並更改狀態值後，將已完成運算的交易們來打包成新區塊（運算中出現錯誤的交易會被丟棄）</strong>，隨後用電腦算力來計算 nonce 值。<br>＊註：這邊的 <strong>nonce 值</strong> 跟前面介紹過的 <strong>以太坊地址的 nonce 值</strong> 不同（以太坊有兩個 nonce：一個是挖礦的；一個是地址的交易<strong>序次</strong>。）<br>＊註 2：運算的同時便會消耗 Gas。</li><li>成功找到 nonce 值，出塊的礦工會獲得<strong>出塊獎勵</strong>及該區塊所有打包交易給的<strong>手續費</strong>。</li><li>該礦工節點將新的區塊廣播至全世界的其他節點們。</li><li>其他節點<strong>同步</strong> &lt;8660586 區塊高度（最新的區塊）&gt;、<br>&lt;State Database&gt;、&lt;Tx Pool&gt; 資料，繼續<strong>廣播與接收新交易</strong>。</li><li>礦工節點再從 Tx Pool 中撈取未出塊的交易們運算並打包成新的區塊。</li></ol><p>以上，便是一筆以太坊交易從發送到出塊會經歷的流程。緊接著我們來一探究竟智慧合約是如何部署的：</p><h3>B. 部署智慧合約</h3><p>我們在 <a href="https://medium.com/pelith/howethsmartcontractwork-328bd8b9bb62?source=friends_link&amp;sk=0a0653a532f922e62008e7a4679ee413">第 2 節</a> 其實有概略性的介紹過一次，此刻我們搭配示意圖更完整地來介紹一遍吧！</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*IUvE0vcq55X-H-7ZoXq3-A.png" /><figcaption>「 部署智慧合約 」流程示意圖</figcaption></figure><ol><li>以 <a href="https://remix.ethereum.org/">Remix</a> 或其它開發工具撰寫完成智慧合約。</li><li>將原始碼編譯為 Bytecode。</li><li>使用者（EOA）透過<strong>錢包</strong>（管理私鑰的工具）輸入交易資訊<br>To: 0x0<br>Amount: 視是否要將 Ether 打入合約中<br>Gas Limit: 按照合約繁複程度決定要設多少<br>Gas Price: 視交易狀況及欲出塊的時間急迫性<br>Input Data: 放入合約 Bytecode</li><li>以<strong>私鑰</strong>簽署交易，廣播<strong>「加上簽名的交易封包」</strong>至鄰近的以太坊節點們。</li><li>節點接收到新交易時，一樣會先至 State Database <strong>檢查交易發起地址是否具有足額 Ether（Balance）可做轉移</strong>（有些情況會把 Ether 打入合約）<strong> </strong>，若無足額則該交易會即刻被丟棄。</li><li>若檢查後確認有足額，則該交易會被放入到 <strong>Tx Pool</strong> 中。<br>（按照 <strong>Gas Price 設的多寡</strong>由高至低排序）</li><li>等待出塊的同時，各節點依舊會<br><strong>A. 廣播接收到的交易</strong><br><strong>B. 接收未在 Tx Pool 內的交易</strong></li><li>礦工節點們<strong>撈取起本筆合約部署交易，進到 EVM 運算。</strong></li><li>將合約程式碼部署至 <strong>Program Code ROM</strong>，是個<strong>部署後便不能進行更動</strong>的 Read-Only Memory（唯獨記憶體）。</li><li>同時，智慧合約亦可以另外使用記憶體（Memory）來儲存合約所需要紀錄的資訊。例如：一個發行 ERC-20 Token 的智慧合約，便可以使用記憶體來 <strong>紀錄各個以太坊地址所「持有 Token 數量」</strong>，追蹤各個地址的 <strong>ERC-20 Token Balance</strong>。</li><li>上方步驟完成後，便會將運算後的結果（合約地址、Gas Used）寫回到該筆交易中。</li><li>礦工節點們將運算完的交易們 <strong>打包成新區塊（運算中出現錯誤 或 Gas 給不夠 的交易會被丟棄）</strong>，隨後用電腦算力來計算 nonce 值。</li><li>成功找到 nonce 值，出塊的礦工會獲得<strong>出塊獎勵</strong>及該區塊所有打包交易給的<strong>手續費</strong>。</li><li>該礦工節點將新的區塊廣播至全世界的其他節點們。</li><li>其他節點<strong>同步</strong> &lt;8660586 區塊高度（最新的區塊）&gt;、<br>&lt;State Database&gt;、&lt;Tx Pool&gt;、<strong>&lt;Contract Code ROM&gt;</strong>、<br><strong>&lt;ERC-20 Token Balance&gt; </strong>資料，繼續<strong>廣播與接收新交易</strong>。</li><li>礦工節點再從 Tx Pool 中撈取未出塊的交易們運算並打包成新的區塊。</li></ol><p>以上，便是一筆<strong>智慧合約部署的交易</strong>從發送到出塊會經歷的流程。<br>最後，我們來解析呼叫智慧合約進行操作與互動：</p><h3>C. 呼叫合約進行互動</h3><p>這部分我們在 <a href="https://medium.com/pelith/howethsmartcontractwork-328bd8b9bb62?source=friends_link&amp;sk=0a0653a532f922e62008e7a4679ee413">第 2 節</a> 與 <a href="https://medium.com/pelith/tokenhistory2-b29971bac999?source=friends_link&amp;sk=0f0605924ddfe306fd249946eb0423b1">第 4 節</a> 其實也有概略性的介紹過，<br>此刻我們搭配示意圖，更著重在節點的部分，較完整地來介紹一遍吧！</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*PFZXJoG0ZZu4ewc2C6k3HA.png" /><figcaption>「 呼叫智慧合約 」流程示意圖</figcaption></figure><ol><li>透過 DApp 介面或其它方式來呼叫智慧合約進行互動</li><li>生成以下形式的交易格式：<br>To: 合約地址<br>Amount: 視是否要將 Ether 打入合約中<br>Gas Limit: 按操作合約的繁複程度決定要設多少<br>Gas Price: 視交易狀況及欲出塊的時間急迫性<br>Input Data: 放入以 <strong>hex 型態表示 </strong>的<strong>「要呼叫的合約 function 與 參數」</strong></li><li>以<strong>私鑰</strong>簽署交易，廣播<strong>「加上簽名的交易封包」</strong>至鄰近的以太坊節點們。</li><li>節點接收到新交易時，一樣會先至 State Database <strong>檢查交易發起地址是否具有足額 Ether（Balance）可做轉移</strong>（如牽涉到）<strong> </strong>，若無足額則該交易會即刻被丟棄。</li><li>若檢查後確認有足額，則該交易會被放入到 <strong>Tx Pool</strong> 中。<br>（按照 <strong>Gas Price 給的多寡</strong>由高至低排序）</li><li>等待出塊的同時，各節點依舊會<br><strong>A. 廣播接收到的交易</strong><br><strong>B. 接收未在 Tx Pool 內的交易</strong></li><li>礦工節點們<strong>撈取起本筆「合約操作交易」，進到 EVM 運算。</strong></li><li>根據合約地址撈出 Program Code ROM 中的合約程式碼。</li><li>依照 MethodID (Function Hash) 找到合約中對應的 Function。</li><li>將相關參數填入進行對應運算。<br>以 ERC-20 Token 的 Transfer Function 為例，運算時便會更改相關地址的 ERC-20 Token Balance。</li><li>上方步驟完成後，便會將運算後的結果（新的 Token Balance、Gas Used）寫回到該筆交易中。</li><li>礦工節點們將運算完的交易們 <strong>打包成新區塊（運算中出現錯誤 或 Gas 給不夠 的交易會被丟棄）</strong>，隨後用電腦算力來計算 nonce 值。</li><li>成功找到 nonce 值，出塊的礦工會獲得<strong>出塊獎勵</strong>及該區塊所有打包交易給的<strong>手續費</strong>。</li><li>該礦工節點將新的區塊廣播至全世界的其他節點們。</li><li>其他節點<strong>同步</strong> &lt;8660586 區塊高度（最新的區塊）&gt;、<br>&lt;State Database&gt;、&lt;Tx Pool&gt;、<strong>&lt;ERC-20 Token Balance&gt; </strong>等資料，繼續<strong>廣播與接收新交易</strong>。</li><li>礦工節點再從 Tx Pool 中撈取未出塊的交易們運算並打包成新的區塊。</li></ol><p>至此，我們便核心地介紹完了以太坊區塊鏈的架構。儘管有許多的技術細節我們此時並未完整交代也未深入著墨，但相信對於初學區塊鏈技術讀者來說應該能逐步建立起區塊鏈架構的全貌。未來我們將持續在這基礎上解析更多面向的區塊鏈技術知識，謝謝大家！</p><p><a href="https://medium.com/pelith/transferoferc20token-16a04e1ee73?source=friends_link&amp;sk=06283189338913e37efa80191de3d889"><strong>下一節</strong></a>，我們將來介紹「為什麼發送 ERC20 Token 需要兩次交易」這個困擾許多人的疑問，在本篇文章中會充分為您解惑，我們將闡明發送 ERC20 Token 背後的技術解析。</p><p>傳送門：<a href="https://medium.com/pelith/transferoferc20token-16a04e1ee73?source=friends_link&amp;sk=06283189338913e37efa80191de3d889"><strong>文組也該知道的區塊鏈技術知識 &lt;8&gt; 為何發送 ERC20 Token 需要兩次交易？</strong></a></p><p>以上，若有任何</p><p><strong>A. 我寫得不夠清楚的地方<br>B. 撰寫上改進的建議<br>C. 希望我能夠撰寫分享的區塊鏈技術知識內容</strong></p><p>都非常歡迎在底下留言回覆。希望我的文章能幫助到更多像我一樣想學習區塊鏈技術與知識的朋友。如果您覺得讀完有所收穫，也希望能<br><strong>＊不吝嗇給我 Like / 50 claps<br>＊分享給您的朋友們<br></strong>謝謝大家！</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fbutton.like.co%2Fin%2Fembed%2Flaijack%2Fbutton%2F&amp;url=https%3A%2F%2Fbutton.like.co%2Flaijack&amp;image=https%3A%2F%2Fstorage.googleapis.com%2Flikecoin-foundation.appspot.com%2Flikecoin_store_user_laijack_main%3FGoogleAccessId%3Dfirebase-adminsdk-eyzut%2540likecoin-foundation.iam.gserviceaccount.com%26Expires%3D2430432000%26Signature%3DUFpz8RkTS%252FPM4LxQe9kKtpAnbs5WAgVdgjw91Hh6xXYviAAtDT2q9U1yoliTe881LuT%252FZtbgXCV8CjdWFYmj105e1%252Bk434yyzFhV3Yw5j8Po%252Bcin0lQQ7K5E13rwPUdN3vlAopvmZoWvG9GUIOY%252FrfPeWPLidhHNo0JRO%252FMJovmwA4C4GLao4v2AG%252FGBPMxtkK2wWyvgpopP9JhVtYqxFAamXr5RAbGd5CSdArfpK9GpqmytALhkDYvZ1RW%252BUf%252Fi7T17N7rTnhOKsmJ0mmMyTr4azasH8ewTh5ZxXE9CUb5f812gsleztbJvBs3ZXak1lwiDjWNdlJnpFIoVwpUi9Q%253D%253D&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=like" width="485" height="212" frameborder="0" scrolling="no"><a href="https://medium.com/media/eb8d8771f4ee83287095f9542ab9f5ad/href">https://medium.com/media/eb8d8771f4ee83287095f9542ab9f5ad/href</a></iframe><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=35fd4849f609" width="1" height="1" alt=""><hr><p><a href="https://medium.com/pelith/structure-of-ethereum-blockchain-35fd4849f609">文組也該知道的區塊鏈技術知識 &lt;7&gt; 以太坊區塊鏈架構</a> was originally published in <a href="https://medium.com/pelith">Pelith</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[《區塊鏈技術知識》目錄]]></title>
            <link>https://medium.com/pelith/blockchain-technical-overview-8c2a643424fa?source=rss-c5fae3649355------2</link>
            <guid isPermaLink="false">https://medium.com/p/8c2a643424fa</guid>
            <category><![CDATA[blockchain]]></category>
            <category><![CDATA[technology]]></category>
            <category><![CDATA[course]]></category>
            <category><![CDATA[bitcoin]]></category>
            <category><![CDATA[ethereum]]></category>
            <dc:creator><![CDATA[Vins Lai @vins.ton]]></dc:creator>
            <pubDate>Wed, 25 Sep 2019 06:44:44 GMT</pubDate>
            <atom:updated>2020-11-20T13:19:59.068Z</atom:updated>
            <content:encoded><![CDATA[<h4>Outline of &lt; Blockchain Technical Overview &gt;</h4><h3>文組也該知道的區塊鏈技術知識</h3><p>Presented by Pelith Inc.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*FIVtGcQkmpo7WXFqX3za5Q.png" /></figure><h4>區塊鏈的學習</h4><p>目前的區塊鏈中文學習資源有點呈現<strong>雙峰分佈</strong>，找得到大量的入門教學跟一些很深入的文章，但中間存在一大段的鴻溝。所以我們決定開始開始寫一些「<strong>有點深入又不太難」的主題</strong>，希望藉由此來幫助到大家，讓讀者更深入認識區塊鏈相關的技術知識！</p><p>區塊鏈的學習比較不像學習任何傳統知識，可以編撰成一本厚厚的書，人們能按圖索驥循序漸進地了解全貌。由於許多環節都仍在<strong>發展中或快速變化的階段</strong>，一種不錯的學習方式可以是<strong>用點來拼出面</strong>。這也是本系列文章撰寫的方向，讓讀者每次學習一個部分的知識，經過本系列文章的逐漸累積應漸能拼湊出區塊鏈技術架構的樣貌。</p><h4>前言</h4><p>收看本系列文章的讀者，應該都對於區塊鏈的基本原理和架構有些概念，如果沒有，推薦您先去 Google 搜尋 <strong>區塊鏈、比特幣、以太坊 </strong>這些關鍵字了解一下。我們將在這些基礎概念之上，來談區塊鏈的技術知識。</p><p>本系列文章並不會談到太深的技術鑽研，而是希望以<strong>深入淺出</strong>的方式讓每一個想要搞懂區塊鏈技術的人都能在讀完後說出：<strong>原來如此！</strong></p><p>本系列文章由區塊鏈技術解決方案開發公司：<strong>Pelith</strong> 編撰。內容皆經過諸位區塊鏈資深研究員及開發者<strong>校對與驗證</strong>，盡可能確保<strong>內容正確無誤</strong>，讓讀者能安心吸收<strong>正確的區塊鏈技術知識</strong>。</p><h3>目錄</h3><p>註：標題即為連結</p><h4><a href="https://medium.com/pelith/%E6%96%87%E7%B5%84%E4%B9%9F%E8%A9%B2%E7%9F%A5%E9%81%93%E7%9A%84%E5%8D%80%E5%A1%8A%E9%8F%88%E6%8A%80%E8%A1%93%E7%9F%A5%E8%AD%98-1-%E5%BE%9E%E4%B8%80%E7%AD%86%E4%BA%A4%E6%98%93%E4%BE%86%E7%9C%8Beth%E8%88%87btc%E4%B9%8B%E7%95%B0%E5%90%8C-15704d74be2c?source=friends_link&amp;sk=75710c2f2a535072b5a535ea190ee2fd">&lt;1&gt; 從一筆交易來看ETH與BTC之異同</a></h4><p>要了解 ETH or BTC 是如何運作，從一筆交易來切入是很好的著力點，因為幾乎<strong>所有的概念與原理都是圍繞著交易</strong>來發生的。本篇文章將從一筆普通的 ETH 交易與一筆 BTC 交易來檢視架構上的異同，藉以了解各自之運作原理。</p><h4><a href="https://medium.com/pelith/howethsmartcontractwork-328bd8b9bb62?source=friends_link&amp;sk=0a0653a532f922e62008e7a4679ee413">&lt;2&gt; 一次搞懂以太坊智慧合約如何運作</a></h4><p>本篇文章我們要來介紹 <strong>以太坊智慧合約</strong>。不會談到實作部分，而是希望能從實際應用場景切入來說明，讓閱讀完本文的讀者都能充分理解<strong>智慧合約的技術運作原理</strong>。</p><h4><a href="https://medium.com/pelith/tokenhistory-dd67cf700b92?source=friends_link&amp;sk=f9f3b1cbbb39d524fefeeeb60f853a6d">&lt;3&gt; 從染色幣到無頭合約的代幣演進史 《上篇》</a></h4><p>第三節我們將來回顧區塊鏈<strong>「代幣」</strong>演進的歷史，並<strong>解析與之相關的技術</strong>。在<a href="https://medium.com/pelith/tokenhistory-dd67cf700b92">《上篇》</a>中我們會談到從比特幣 USDT 到以太坊 ERC-20 Token 的自定義代幣技術發展史。</p><h4><a href="https://medium.com/pelith/tokenhistory2-b29971bac999?source=friends_link&amp;sk=0f0605924ddfe306fd249946eb0423b1">&lt;4&gt; 從染色幣到無頭合約的代幣演進史 《下篇》</a></h4><p>《下篇》將更著重在以太坊自定義代幣技術面的介紹，並展望到以太坊 2.0 Phase 1 相關的技術解析。</p><h4><a href="https://medium.com/pelith/behindtheethtransaction-534dc6ce123e?source=friends_link&amp;sk=996607b64b68138c30efe7f1d3976986">&lt;5&gt; 不可不知的以太坊交易打包規則</a></h4><p><strong>「奇怪，我的交易怎麼一直送不出去？」 </strong>相信大家或多或少都曾遇到或被問過這樣的問題。本篇我們要帶大家細看以太坊交易背後的知識與原理。</p><h4><a href="https://medium.com/pelith/structure-of-blockchain-daf85e06027e?source=friends_link&amp;sk=39ddaa60407081ed53baf714c1234d06">&lt;6&gt; 一次搞懂「區塊鏈架構」Structure of Blockchain (Bitcoin)</a></h4><p>本篇我們將核心地介紹 中本聰設計的初代區塊鏈 <strong>比特幣 Bitcoin</strong>。藉由首創的<strong>「比特幣區塊鏈架構概念圖」</strong>讓讀者完整地建立區塊鏈技術的完整架構。</p><h4><a href="https://medium.com/pelith/structure-of-ethereum-blockchain-35fd4849f609?source=friends_link&amp;sk=55f628562d7b141555cf92f651bff957">&lt;7&gt; 以太坊區塊鏈架構 How Ethereum Blockchain Work</a></h4><p>我們將接續 第 6 篇，介紹 <strong>區塊鏈 2.0－ </strong>Vitalik 如何在中本聰設計的比特幣架構上進行升級與改動，同時也將首度揭曉<strong>「以太坊區塊鏈架構圖」</strong>！</p><h4><a href="https://medium.com/pelith/transferoferc20token-16a04e1ee73?source=friends_link&amp;sk=06283189338913e37efa80191de3d889">&lt;8&gt; 為何發送 ERC20 Token 需要兩次交易？</a></h4><p><strong><em>Transfer of ERC20 Token<br></em></strong>這個困擾許多人的疑問將在本篇文章中充分為您解惑，我們將闡明發送 ERC20 Token 背後的技術解析。</p><h4><a href="https://medium.com/pelith/oracle-a2016c17a56f?sk=5fa18e5bbed802e24ff7d9120bca48f4">&lt;9&gt; 區塊鏈與現實世界間的橋樑：Oracle（預言機）</a></h4><p>以太坊智慧合約的出現為區塊鏈的應用層面增添了非常多的可能性。然而發展至今隨著 DeFi 熱潮出現了 <strong>區塊鏈當前面臨到最大的問題</strong>：如何將現實世界的事實（如：球賽結果、天氣、航班）餵入區塊鏈上，並依結果觸發程式碼來執行後續程式邏輯。</p><p>本篇文章我們將帶大家認識幾個指標性的 Oracle 實作方式，並評析何謂好的 Oracle 機制。</p><h4><a href="https://medium.com/pelith/ethereum-nodes-d3e07745d189?source=friends_link&amp;sk=f30a16455e43b692963e88860fd5eca1">&lt;10&gt; 全節點與輕節點：以太坊節點面面觀</a></h4><p>在本系列過往的文章中我們逐一介紹了以太坊各個環節的運作機制，相信有在持續關注的讀者都已對以太坊技術架構有粗略的認識。</p><p>因應以太坊 2.0 的即將來臨，本篇文章將針對以太坊節點（Ethereum Nodes）做概論性的介紹，讓讀者能充分瞭解節點的運作機制。</p><blockquote>To Be Continued…</blockquote><p>以上，若有任何</p><p><strong>A. 我寫得不夠清楚的地方<br>B. 撰寫上改進的建議<br>C. 希望我能夠撰寫分享的區塊鏈技術知識內容</strong></p><p>都非常歡迎在底下留言回覆。希望我的文章能幫助到更多像我一樣想學習區塊鏈技術與知識的朋友。如果您覺得讀完有所收穫，也希望能<br><strong>＊不吝嗇給我 Like / 50 claps<br>＊分享給您的朋友們<br></strong>謝謝大家！</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fbutton.like.co%2Fin%2Fembed%2Flaijack%2Fbutton%2F&amp;url=https%3A%2F%2Fbutton.like.co%2Flaijack&amp;image=https%3A%2F%2Fstorage.googleapis.com%2Flikecoin-foundation.appspot.com%2Flikecoin_store_user_laijack_main%3FGoogleAccessId%3Dfirebase-adminsdk-eyzut%2540likecoin-foundation.iam.gserviceaccount.com%26Expires%3D2430432000%26Signature%3DUFpz8RkTS%252FPM4LxQe9kKtpAnbs5WAgVdgjw91Hh6xXYviAAtDT2q9U1yoliTe881LuT%252FZtbgXCV8CjdWFYmj105e1%252Bk434yyzFhV3Yw5j8Po%252Bcin0lQQ7K5E13rwPUdN3vlAopvmZoWvG9GUIOY%252FrfPeWPLidhHNo0JRO%252FMJovmwA4C4GLao4v2AG%252FGBPMxtkK2wWyvgpopP9JhVtYqxFAamXr5RAbGd5CSdArfpK9GpqmytALhkDYvZ1RW%252BUf%252Fi7T17N7rTnhOKsmJ0mmMyTr4azasH8ewTh5ZxXE9CUb5f812gsleztbJvBs3ZXak1lwiDjWNdlJnpFIoVwpUi9Q%253D%253D&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=like" width="485" height="212" frameborder="0" scrolling="no"><a href="https://medium.com/media/eb8d8771f4ee83287095f9542ab9f5ad/href">https://medium.com/media/eb8d8771f4ee83287095f9542ab9f5ad/href</a></iframe><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=8c2a643424fa" width="1" height="1" alt=""><hr><p><a href="https://medium.com/pelith/blockchain-technical-overview-8c2a643424fa">《區塊鏈技術知識》目錄</a> was originally published in <a href="https://medium.com/pelith">Pelith</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[文組也該知道的區塊鏈技術知識 <6> 一次搞懂「區塊鏈架構」]]></title>
            <link>https://medium.com/pelith/structure-of-blockchain-daf85e06027e?source=rss-c5fae3649355------2</link>
            <guid isPermaLink="false">https://medium.com/p/daf85e06027e</guid>
            <category><![CDATA[bitcoin]]></category>
            <category><![CDATA[technology]]></category>
            <category><![CDATA[blockchain-technology]]></category>
            <category><![CDATA[course]]></category>
            <category><![CDATA[blockchain]]></category>
            <dc:creator><![CDATA[Vins Lai @vins.ton]]></dc:creator>
            <pubDate>Tue, 24 Sep 2019 10:19:40 GMT</pubDate>
            <atom:updated>2019-11-26T06:31:18.957Z</atom:updated>
            <content:encoded><![CDATA[<h4>Blockchain Technical Overview &lt;6&gt; Structure of Blockchain (Bitcoin)</h4><blockquote>收看本系列文章的讀者，應該都對於區塊鏈的基本原理和架構有些概念，如果沒有，推薦您先去 Google 搜尋 <strong>區塊鏈、比特幣、以太坊</strong>這些關鍵字了解一下。我們將在這些基礎概念之上，來談區塊鏈的技術知識。本系列文章並不會談到太深的技術鑽研，而是希望以<strong>深入淺出</strong>的方式讓每一個想要搞懂區塊鏈技術的人都能在讀完後說出：<strong>原來如此！</strong></blockquote><blockquote>本系列文章由區塊鏈技術解決方案開發公司：<strong>Pelith</strong> 編撰。內容皆經過諸位區塊鏈資深研究員及開發者<strong>校對與驗證</strong>，盡可能確保<strong>內容正確無誤</strong>，讓讀者能安心吸收<strong>正確的區塊鏈技術知識</strong>。</blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*NVrqm9fQBwosjdV5Bl3r3A.png" /></figure><p><a href="https://medium.com/pelith/behindtheethtransaction-534dc6ce123e"><strong>上一節</strong></a> 中，我們在介紹以太坊交易打包規則時帶大家大致了解區塊鏈運作的架構，不過有些技術細節我們沒有完整地交代清楚，本篇及未來數篇文我們將更深入且完整地介紹區塊鏈技術架構，並且帶大家認識目前區塊鏈遇到的各種問題及許多專案在嘗試解決的部分！</p><p>廢話不多說，我們先從中本聰設計的初代區塊鏈 <strong>比特幣 Bitcoin</strong> 來談起：</p><h3>How Bitcoin Blockchain Work</h3><p>如果<a href="https://medium.com/pelith/tagged/course">前面幾節</a>大家有認真看的話，應該還記得比特幣是採用 <strong>UTXO 架構</strong>。<br>我們從比特幣一筆交易的一生帶大家來一探究竟區塊鏈是如何運作的：</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*VcLpDWRuh5LkZfE_g2ffgA.png" /><figcaption>比特幣交易流程示意圖</figcaption></figure><h4>比特幣交易的一生</h4><ol><li>一個使用者欲發起一筆交易。</li><li>透過<strong>錢包</strong>（管理私鑰的工具）輸入交易資訊<br>（To, Amount, 手續費, OP_Return …）。</li><li>以<strong>私鑰</strong>簽署交易。</li><li>廣播<strong>「加上簽名的交易封包」</strong>至鄰近的比特幣節點們。</li><li>節點接收到新交易時，會先至 UTXO Pool <strong>檢查交易發起地址是否能動用足額 UTXO</strong>，若無則該交易會即刻被丟棄。<br>＊註：圖中以一個 Balance 值來做標註，但其實這個 Balance 可能是多個 UTXO 的集合，Steve 的 18 可能其實是 0.25+10.75+2+5 四個 <strong>錢堆</strong>。</li><li>若檢查後確認有足額，則該交易會被放入到 <strong>Tx Pool</strong> 中。<br>（按照<strong>手續費給的多寡</strong>由高至低排序）</li><li>等待出塊的同時，各節點會<br><strong> A. 廣播接收到的交易</strong><br><strong> B. 接收未在 Tx Pool 內的交易</strong></li><li>礦工節點們（有在用電腦算力找 nonce 值，拼出塊獎勵的節點）會<br><strong>撈取手續費較高的交易們來運算並打包成新區塊</strong>，<br>用電腦算力計算 nonce 值。<br>＊註：這邊的 <strong>nonce 值</strong> 跟前面介紹過的 <strong>以太坊地址的 nonce 值</strong> 不同（以太坊有兩個 nonce：一個是挖礦的；一個是地址的交易<strong>序次</strong>。）</li><li>成功找到找到 nonce 值，出塊的礦工會獲得<strong>出塊獎勵</strong>及該區塊所有打包交易給的<strong>手續費</strong>。</li><li>該礦工節點將新的區塊廣播至全世界的其他節點們。</li><li>其他節點<strong>同步</strong> &lt;595266 區塊高度（最新的區塊）&gt;、&lt;UTXO Pool&gt;、&lt;Tx Pool&gt; 資料，繼續<strong>廣播與接收新交易</strong>。</li><li>礦工節點再從 Tx Pool 中撈取未出塊的交易們（生成 Merkle Root ）運算並打包成新的區塊。</li></ol><p>以上，便是區塊鏈運作的方式。</p><p>不過由於全世界可能每時每刻都有人在發起新的交易，所以以上這些過程都是 24/7/365.25 不斷在 <strong>動態運作中 </strong>的。</p><p>光憑上述 12 點其實很難清楚交代許多的技術細節，所以我們將針對幾點再做更進一步的介紹：</p><h3>(3) 私鑰簽署數位簽名 Digital Signature</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1000/1*PQve_MqgyWFQVAMKngBmqA.jpeg" /><figcaption>數位簽名與驗證示意圖（<a href="https://zhaohuabing.com/2018/05/12/cryptocurrency_week1_digital_signature/">https://zhaohuabing.com/2018/05/12/cryptocurrency_week1_digital_signature/</a>）</figcaption></figure><h4>為什麼發送交易需要使用私鑰進行簽名？</h4><p>試想一下，若是沒有這樣的機制，<strong>就無法知道交易是不是由地址的主人發出的。</strong>因此當我發送交易時，必須有機制能證明這個交易是由我本人來發出。我們先來看一段《精通比特幣》的論述：</p><blockquote><strong>《 精通比特幣（Mastering Bitcoin）第四章 》</strong><br>私鑰可用於為交易生成指紋（數位簽名）。這個簽名只能由知道私鑰的人制作。但是，<strong>任何有權訪問公鑰和交易指紋的人都可以使用它們來驗證簽名確實是私鑰的擁有者生成的。</strong>非對稱加密的這一有用特性使任何人都可以驗證每筆交易的每個簽名，同時確保<strong>只有私鑰所有者才能生成有效的簽名。</strong></blockquote><p>因此，能唯一證明的機制便是：用我的私鑰生成一個<strong>「數位簽名」</strong>後，連同交易內容一起送出。節點接收到這筆加上簽名的交易時，可以用<strong>我的公鑰</strong>來驗證這個簽名是由<strong>我的私鑰</strong>所簽署的。如此來證明這個交易是由我送出的。</p><h3>(5) UTXO Pool</h3><p>接著，我們來介紹 UTXO Pool：所謂的區塊鏈其實就是自主網上線以來的所有歷史區塊，區塊內包含零至數筆的交易資料。而比特幣至 2019/9 為止的近 60 萬個區塊 資料大小約為 250 GB。</p><p>上方第 (5) 點，節點接收交易要檢查時，照理來說應該是要把近 60 萬個區塊資料都爬過一遍才能確認該地址可動用的餘額。然而，這麼做曠日費時，當區塊越來越多，且每一筆交易接收時都要整個掃描一遍時，會因掃描時間過長導致節點之間的同步出現問題。</p><p>因此，UTXO Pool 便出現了。作法是：<strong>用資料庫記錄一個掃描過後的最終狀態</strong>，並在這之上再依據後續區塊做更新變動。亦即<strong>把已花費的 Output 紀錄都丟棄掉，只保留最後 Unspent 的 Tx Output。</strong>如此便不用每筆交易接收時都要掃描整條區塊鏈，只要掃描去蕪存菁的 UTXO Pool 就可以了。</p><h3>(10) 節點 Node</h3><p>了解 UTXO Pool 後，接著來進一步介紹節點。節點是維持區塊鏈網路運作的根基，區塊鏈之所以能做到去中心化，便是因為在全世界有無數的節點在同步與備份所有的區塊資料（全交易歷史紀錄）。</p><h4>(11) 節點同步（不斷刷新推算）</h4><p>當我接收到一筆新的交易並驗證後，放進我的 Tx Pool 中，我會同時把這筆交易廣播給鄰近的節點們。鄰近的節點們驗證、接收並同步後也會再廣播給他們鄰近的節點們，如此將資訊以網狀廣播出去，讓各個節點之間維持一個<strong>「動態同步」</strong>的狀態。</p><h4><strong>(12) 節點不一定等於礦工</strong></h4><p>節點可以選擇<strong>要不要進行挖礦</strong>，也就是說：我可以<strong>單純的接收、同步與廣播</strong>「Block、UTXO Pool、Tx Pool」資料，只做帳本更新動作，當個稱職的傳聲筒為去中心化世界做貢獻，不花算力去打包交易、計算 nonce 拼出塊獎勵。</p><p>而這些<strong>節點們</strong>便是所謂的 <strong>Peer to Peer（P2P）Network</strong> <strong>「點對點網路」</strong>。</p><p>以上便是核心版的區塊鏈架構，中間有許多的技術細節我們先不深入著墨。因為這是一個由淺入深的系列文，未來會逐一介紹到的！</p><h3>Blockchain Demo</h3><p>最後，如果想更了解區塊鏈如何運作的朋友，可以到下方這個網站去逛逛，實際體驗、操作看看區塊鏈是如何運作的！</p><p><a href="https://anders.com/blockchain/">Blockchain Demo</a></p><p><em>（</em><a href="https://anders.com/blockchain/"><em>https://anders.com/blockchain/</em></a><em>）</em></p><p>此外，也跟大家預告一下精彩可期的未來數篇文章：</p><h4><a href="https://medium.com/pelith/structure-of-ethereum-blockchain-35fd4849f609?sk=55f628562d7b141555cf92f651bff957">&lt;7&gt; 以太坊區塊鏈架構 How Ethereum Blockchain Work</a></h4><p>（標題即為文章連結）<br>我們將接續本篇文章，介紹 <strong>區塊鏈 2.0－ </strong>Vitalik 如何在中本聰設計的比特幣架構上進行升級與改動，同時也將首度揭曉<strong>「以太坊區塊鏈架構圖」</strong>！</p><h4>&lt;8&gt; 區塊鏈技術地圖 Blockchain Technical Roadmap</h4><p><strong>比特幣資深研究員「陳伯韋」五年多來的研究結晶完全公開！<br></strong>我們將依區塊鏈架構清楚剖析目前區塊鏈遇到的各項問題（<strong>隱私問題、儲存問題、速度問題</strong> 等），並<strong>摘要介紹目前各個 項目／團隊 針對各項問題提出的解決方案</strong>！</p><h4>&lt;9&gt; 去中心化金融技術解析 How Decentralized Finance (DeFi) Work</h4><p>DeFi 正夯，到底在紅什麼呢？DeFi 如何解決傳統金融遇到的界線與問題呢？透過本篇文章將（盡可能）解答您心中的疑問！</p><p>以上，若有任何</p><p><strong>A. 我寫得不夠清楚的地方<br>B. 撰寫上改進的建議<br>C. 希望我能夠撰寫分享的區塊鏈技術知識內容</strong></p><p>都非常歡迎在底下留言回覆。希望我的文章能幫助到更多像我一樣想學習區塊鏈技術與知識的朋友。如果您覺得讀完有所收穫，也希望能<br><strong>＊不吝嗇給我 Like / 50 claps<br>＊分享給您的朋友們<br></strong>謝謝大家！</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fbutton.like.co%2Fin%2Fembed%2Flaijack%2Fbutton%2F&amp;url=https%3A%2F%2Fbutton.like.co%2Flaijack&amp;image=https%3A%2F%2Fstorage.googleapis.com%2Flikecoin-foundation.appspot.com%2Flikecoin_store_user_laijack_main%3FGoogleAccessId%3Dfirebase-adminsdk-eyzut%2540likecoin-foundation.iam.gserviceaccount.com%26Expires%3D2430432000%26Signature%3DUFpz8RkTS%252FPM4LxQe9kKtpAnbs5WAgVdgjw91Hh6xXYviAAtDT2q9U1yoliTe881LuT%252FZtbgXCV8CjdWFYmj105e1%252Bk434yyzFhV3Yw5j8Po%252Bcin0lQQ7K5E13rwPUdN3vlAopvmZoWvG9GUIOY%252FrfPeWPLidhHNo0JRO%252FMJovmwA4C4GLao4v2AG%252FGBPMxtkK2wWyvgpopP9JhVtYqxFAamXr5RAbGd5CSdArfpK9GpqmytALhkDYvZ1RW%252BUf%252Fi7T17N7rTnhOKsmJ0mmMyTr4azasH8ewTh5ZxXE9CUb5f812gsleztbJvBs3ZXak1lwiDjWNdlJnpFIoVwpUi9Q%253D%253D&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=like" width="485" height="212" frameborder="0" scrolling="no"><a href="https://medium.com/media/eb8d8771f4ee83287095f9542ab9f5ad/href">https://medium.com/media/eb8d8771f4ee83287095f9542ab9f5ad/href</a></iframe><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=daf85e06027e" width="1" height="1" alt=""><hr><p><a href="https://medium.com/pelith/structure-of-blockchain-daf85e06027e">文組也該知道的區塊鏈技術知識 &lt;6&gt; 一次搞懂「區塊鏈架構」</a> was originally published in <a href="https://medium.com/pelith">Pelith</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[文組也該知道的區塊鏈技術知識 <5> 不可不知的以太坊交易打包規則]]></title>
            <link>https://medium.com/pelith/behindtheethtransaction-534dc6ce123e?source=rss-c5fae3649355------2</link>
            <guid isPermaLink="false">https://medium.com/p/534dc6ce123e</guid>
            <category><![CDATA[course]]></category>
            <category><![CDATA[eth]]></category>
            <category><![CDATA[transactions]]></category>
            <category><![CDATA[ethereum]]></category>
            <category><![CDATA[blockchain]]></category>
            <dc:creator><![CDATA[Vins Lai @vins.ton]]></dc:creator>
            <pubDate>Thu, 12 Sep 2019 06:19:12 GMT</pubDate>
            <atom:updated>2019-11-26T06:30:04.988Z</atom:updated>
            <content:encoded><![CDATA[<h4>Blockchain Technical Overview &lt;5&gt; Behind The ETH Transaction</h4><blockquote><em>收看本系列文章的讀者，應該都對於區塊鏈的基本原理和架構有些概念，如果沒有，推薦您先去 Google 搜尋 </em><strong><em>區塊鏈、比特幣、以太坊</em></strong><em>這些關鍵字了解一下。我們將在這些基礎概念之上，來談區塊鏈的技術知識。本系列文章並不會談到太深的技術鑽研，而是希望以深入淺出的方式讓每一個想要搞懂區塊鏈技術的人都能在讀完後說出：原來如此！</em></blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*4AGiMMegn3knwNm1a6BKuQ.png" /></figure><blockquote>奇怪，我的交易怎麼一直送不出去？</blockquote><p>相信大家或多或少都曾遇到或被問過這樣的問題。在 <a href="https://medium.com/pelith/tokenhistory-dd67cf700b92">第 3 篇</a> 與 <a href="https://medium.com/pelith/tokenhistory2-b29971bac999">第 4 篇</a> 文章中我們藉由區塊鏈代幣的演進史來解析 Token 背後的技術運作原理，大家對於智慧合約應該有更深一層的認識與了解。本篇我們要來帶大家細看以太坊交易背後的知識與原理：</p><p><strong>＊究竟在我們送出交易後到出塊上鏈之間發生了哪些事？<br>＊為什麼以太坊會塞車？<br>＊交易塞車在技術上到底是發生了什麼事？<br>＊交易送不出去要怎麼辦？</strong></p><p>以上這些常見的問題應該都能在本篇文章中得到解答。</p><h3>以太坊交易的本質</h3><p>首先，大家應該都還記得在 <a href="https://medium.com/pelith/%E6%96%87%E7%B5%84%E4%B9%9F%E8%A9%B2%E7%9F%A5%E9%81%93%E7%9A%84%E5%8D%80%E5%A1%8A%E9%8F%88%E6%8A%80%E8%A1%93%E7%9F%A5%E8%AD%98-1-%E5%BE%9E%E4%B8%80%E7%AD%86%E4%BA%A4%E6%98%93%E4%BE%86%E7%9C%8Beth%E8%88%87btc%E4%B9%8B%E7%95%B0%E5%90%8C-15704d74be2c">第一篇</a> 中談到了以太坊交易的本質，我給你 10 Ether 不是我真的把什麼東西給了你，而是我向以太坊網絡提出了更改餘額狀態的請求，讓各個節點上紀錄的 <strong>你與我的 Ether Balance </strong>進行更新。</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*UO-qlPnndxGr9aYWouzdpA.png" /><figcaption>Ethereum 交易之狀態更新示意圖</figcaption></figure><p>然而，送出交易在技術上並不困難，<strong>區塊鏈的重點是在於打包交易並出塊的過程</strong>。如何驗證、確認交易是否有效，讓這筆交易順利發生，並讓各個節點即時更新以擁有相同的帳本，這樣<strong>打包交易並出塊的機制即「挖礦」</strong>。</p><h3>以太坊交易送出至出塊的流程</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*2lKwyz5RiCyHhT7pdbQAtA.png" /><figcaption>以太坊交易送出至出塊流程 (<a href="https://web3j.readthedocs.io/en/latest/transactions.html">https://web3j.readthedocs.io/en/latest/transactions.html</a>)</figcaption></figure><p>透過上圖我們可以一覽</p><h4><strong>以太坊上一筆交易送出後經歷的流程</strong>：</h4><ol><li>發送交易</li><li>私鑰簽名</li><li>交易發送至節點</li><li>節點間廣播新接收交易</li><li>礦工打包交易並出塊</li></ol><p>上圖可能有些細節交代不夠清楚，我們再用下面這張圖來補充說明：</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*QhwOCmBwX4V2bsaBSeIQ-A.png" /><figcaption>MyEtherWallet 交易送出後經歷的流程示意圖 (<a href="https://kb.myetherwallet.com/">https://kb.myetherwallet.com/</a>)</figcaption></figure><p>交易送出之後，會被丟進一個「交易池」裡，等待被礦工打包。<br>礦工從「交易池」中撈出未出塊的交易來進行打包與出塊。</p><p>因為每個區塊有大小限制，<strong>比特幣</strong>一個區塊是<strong> 1MB 的容量限制</strong>；<strong>以太坊</strong>的區塊則是以 Gas 來計算，有 <strong>800 萬 Gas 的限制</strong>。若以一筆基礎交易 21,000 Gas 來計算，一個以太坊區塊可以容納 380 筆交易。因此當「交易池」裡的交易量大時，會有許多交易沒辦法即時被打包而滯留在池子中等待。</p><h4>如何挑選要撈出哪些交易？</h4><p>礦工節點可以自行設置參數，不過大多數礦工都是按造手續費的多寡排序，手續費高的會優先被打包出塊；手續費低的則可能要等到天荒地老。</p><p>回顧 <a href="https://medium.com/pelith/%E6%96%87%E7%B5%84%E4%B9%9F%E8%A9%B2%E7%9F%A5%E9%81%93%E7%9A%84%E5%8D%80%E5%A1%8A%E9%8F%88%E6%8A%80%E8%A1%93%E7%9F%A5%E8%AD%98-1-%E5%BE%9E%E4%B8%80%E7%AD%86%E4%BA%A4%E6%98%93%E4%BE%86%E7%9C%8Beth%E8%88%87btc%E4%B9%8B%E7%95%B0%E5%90%8C-15704d74be2c">第一節</a> 我們介紹過的以太坊手續費計算公式：</p><pre>以太坊交易手續費公式：<strong><br>Tx Fee（手續費）＝ Gas Used（燃料用量） * Gas Price（單位燃料價格）</strong></pre><p>由於 Gas Used 是由系統決定的，我們在發送交易時決定手續費多寡的決定性變因就是 Gas Price 了。下方我們以 Metamask 介面來做介紹：</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*3bCicyTnb9GAJjvzxUtlLw.png" /><figcaption>Metamask 發送交易的頁面流程圖</figcaption></figure><p>在上圖左方我們可以看到系統預設有三個速度可以供選擇，不過要更近一步設定，可以點<strong>「進階選項」</strong>，便會進到上圖右方的畫面。</p><p>我們可以自行設定 Gas Price 及 調整交易的 Gas Limit。WEI 是以太坊上最小的單位（10^-18 Ether）；GWEI（10^-9 Ether）則是 1G 的 WEI。<br>圖中的 Gas Price 設定為 10 GWEI；Gas Limit 為 21,000。因此：</p><pre>10 GWEI<strong>（單位燃料價格）</strong>* 21,000<strong>（燃料用量）</strong>= 0.00021 Ether<strong>（手續費）</strong></pre><h4>Gas Limit</h4><p>若是要操作智慧合約等較繁複的功能，不太確定實際的 Gas Used，也可以把 Gas Limit 調高一些，被打包時只會收取實際 Gas Used 作為手續費，多給的 Gas 會退返回來。</p><p>不過由於以太坊區塊有 800 萬 Gas 的大小限制，若把 Gas Limit 設太高，也可能產生<strong>塞不進區塊中</strong>而<strong>滯留在「交易池」裡</strong>的情況。</p><h4>GWEI</h4><p>至於要設多少 GWEI，我們可以到 <a href="https://ethgasstation.info/">ETH gas station</a> 上查看即時的「交易池」狀況：</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Pf_LrcAuGTCrJwt5zyazvg.png" /><figcaption>ETH GAS STATION 上的 Gas Price 建議</figcaption></figure><p>可以看到如果希望交易能盡快被確認，GWEI 可能要設到 20 以上，大約在 2 分鐘內可以被確認完成（不過通常設到 FAST，應該 15~30 秒就會被確認了）。截圖當下其實是偏塞車的情形，通常 10 GWEI 左右就可以達到 FAST（&lt;2 mins），截圖當下卻要 20 GWEI。</p><p>這邊顯示的 Gas Price 建議，其實就是「交易池」裡的狀況：池裡有多少筆 pending 的交易、這些池裡的交易給的手續費是多少。根據這些資訊依據來呈現設的 Gas Price 估計要多少個區塊（時間）後才會被打包上鏈。</p><p>然而，許多人常遇到關於交易的問題：</p><blockquote>我的交易怎麼一直送不出去怎麼辦？</blockquote><p>也許是 Gas Price 設太低，或是突然有大量交易湧入等各樣的情況。這時其實有補救的方法：</p><h3>加速交易</h3><p>當交易由 Metamask 送出後，可以看到下方會有個<strong>「加速」</strong>的按鈕，點進去後便可以再次設定 Gas Price，設定並重新送出交易後，就可以在底下的活動紀錄看到手續費被提高了。</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*yu-_eUXnxK3SR4ETasl50w.png" /><figcaption>加速交易的流程圖</figcaption></figure><h3>取消交易</h3><p>除了能加速交易，其實也可以取消交易。方法便是點擊等待處理的交易，展開後可以看到<strong>「取消」</strong>的按鈕，點擊並確認後 Metamask 會向節點發送取消交易的請求，並在確認取消後收取手續費。</p><p>若發現取消交易的請求 pending 有點久，其實在下方可以看到有「加速取消」的按鈕，可以再進行進一步設定。</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*GywqDlO6H8zuvbChjaOoEg.png" /><figcaption>取消交易的流程圖</figcaption></figure><p>那麼，以上這些過程其實是發生了什麼事，技術上如何做到的呢？<br>答案跟我們在 <a href="https://medium.com/pelith/%E6%96%87%E7%B5%84%E4%B9%9F%E8%A9%B2%E7%9F%A5%E9%81%93%E7%9A%84%E5%8D%80%E5%A1%8A%E9%8F%88%E6%8A%80%E8%A1%93%E7%9F%A5%E8%AD%98-1-%E5%BE%9E%E4%B8%80%E7%AD%86%E4%BA%A4%E6%98%93%E4%BE%86%E7%9C%8Beth%E8%88%87btc%E4%B9%8B%E7%95%B0%E5%90%8C-15704d74be2c">第一節</a> 談到的 nonce 有關，做法是：</p><h4>再發送一個同樣 nonce 的交易</h4><p>由於以太坊 nonce 的設計，會追蹤每個地址所有交易的<strong>「序次」</strong>，也就是說<strong>每個 nonce 只會有一筆交易</strong>。</p><h4>加速交易</h4><p>因此加速交易便是<strong>我再發送一筆同個 nonce、同樣內容的交易</strong>。因為提高了交易手續費，所以當<strong>同樣 nonce 的兩個交易都位於「交易池」中</strong>，<strong>後發的手續費較高的交易原則上會被優先打包出塊</strong>。因為每個 nonce 只能有一筆交易，先發的那筆手續費較低的交易永遠不會被打包，於是便會被系統給丟棄，因而交易失敗。</p><h4>取消交易</h4><p>取消交易其實也是類似的邏輯，做法是：<br><strong>我再發送一筆給自己 0 Ether 的同 nonce 交易。<br></strong>由於這筆交易手續費較高，會優先被打包出塊，讓原交易被系統丟棄而交易失敗，如此來達到取消交易的目的。</p><h3>結論</h3><ol><li>交易送出後會被丟到一個<strong>「交易池」</strong>中等待被礦工打包，決定先後順序的主要因子為「單位 Gas Price（GWEI）」給的多寡。</li><li>發送交易時可以到 <a href="https://ethgasstation.info/">ETH gas station</a> 參考即時的「交易池」狀況再來決定要設多少 GWEI 以能在預期的時間內被打包上鏈。</li><li>若發現交易持續滯留在「交易池」中等待被處理，可以「加速交易」或「取消交易」。</li></ol><p>介紹至此，大家應該都對以太坊交易的背後邏輯與打包規則有更深一層的認識了。<a href="https://medium.com/pelith/structure-of-blockchain-daf85e06027e?sk=39ddaa60407081ed53baf714c1234d06">下一節</a> 我們將更完整且完整地介紹區塊鏈架構，帶各位讀者一同檢視中本聰設計的初代區塊鏈：比特幣 Bitcoin 是如何運作的。</p><p>傳送門：<a href="https://medium.com/pelith/structure-of-blockchain-daf85e06027e?sk=39ddaa60407081ed53baf714c1234d06">文組也該知道的區塊鏈技術知識 &lt;6&gt; 一次搞懂「區塊鏈架構」</a></p><p>以上，若有任何</p><p><strong>A. 我寫得不夠清楚的地方<br>B. 撰寫上改進的建議<br>C. 希望我能夠撰寫分享的區塊鏈技術知識內容</strong></p><p>都非常歡迎在底下留言回覆。希望我的文章能幫助到更多像我一樣想學習區塊鏈技術與知識的朋友。如果您覺得讀完有所收穫，也希望能<br><strong>＊不吝嗇給我 Like / 50 claps<br>＊分享給您的朋友們<br></strong>謝謝大家！</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fbutton.like.co%2Fin%2Fembed%2Flaijack%2Fbutton%2F&amp;url=https%3A%2F%2Fbutton.like.co%2Flaijack&amp;image=https%3A%2F%2Fstorage.googleapis.com%2Flikecoin-foundation.appspot.com%2Flikecoin_store_user_laijack_main%3FGoogleAccessId%3Dfirebase-adminsdk-eyzut%2540likecoin-foundation.iam.gserviceaccount.com%26Expires%3D2430432000%26Signature%3DUFpz8RkTS%252FPM4LxQe9kKtpAnbs5WAgVdgjw91Hh6xXYviAAtDT2q9U1yoliTe881LuT%252FZtbgXCV8CjdWFYmj105e1%252Bk434yyzFhV3Yw5j8Po%252Bcin0lQQ7K5E13rwPUdN3vlAopvmZoWvG9GUIOY%252FrfPeWPLidhHNo0JRO%252FMJovmwA4C4GLao4v2AG%252FGBPMxtkK2wWyvgpopP9JhVtYqxFAamXr5RAbGd5CSdArfpK9GpqmytALhkDYvZ1RW%252BUf%252Fi7T17N7rTnhOKsmJ0mmMyTr4azasH8ewTh5ZxXE9CUb5f812gsleztbJvBs3ZXak1lwiDjWNdlJnpFIoVwpUi9Q%253D%253D&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=like" width="485" height="212" frameborder="0" scrolling="no"><a href="https://medium.com/media/eb8d8771f4ee83287095f9542ab9f5ad/href">https://medium.com/media/eb8d8771f4ee83287095f9542ab9f5ad/href</a></iframe><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=534dc6ce123e" width="1" height="1" alt=""><hr><p><a href="https://medium.com/pelith/behindtheethtransaction-534dc6ce123e">文組也該知道的區塊鏈技術知識 &lt;5&gt; 不可不知的以太坊交易打包規則</a> was originally published in <a href="https://medium.com/pelith">Pelith</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[文組也該知道的區塊鏈技術知識 <4> 從染色幣到無頭合約的代幣演進史《下篇》]]></title>
            <link>https://medium.com/pelith/tokenhistory2-b29971bac999?source=rss-c5fae3649355------2</link>
            <guid isPermaLink="false">https://medium.com/p/b29971bac999</guid>
            <category><![CDATA[bitcoin]]></category>
            <category><![CDATA[blockchain]]></category>
            <category><![CDATA[token]]></category>
            <category><![CDATA[ethereum]]></category>
            <category><![CDATA[course]]></category>
            <dc:creator><![CDATA[Vins Lai @vins.ton]]></dc:creator>
            <pubDate>Mon, 02 Sep 2019 08:06:15 GMT</pubDate>
            <atom:updated>2019-11-26T06:28:50.411Z</atom:updated>
            <content:encoded><![CDATA[<h3>文組也該知道的區塊鏈技術知識 &lt;4&gt; 從染色幣到無頭合約的代幣演進史 《下篇》</h3><h4>Blockchain Technical Overview &lt;4&gt; The History of Token ( Part 2 )</h4><blockquote>收看本系列文章的讀者，應該都對於區塊鏈的基本原理和架構有些概念，如果沒有，推薦您先去 Google 搜尋 <strong>區塊鏈、比特幣、以太坊</strong>這些關鍵字了解一下。我們將在這些基礎概念之上，來談區塊鏈的技術知識。本系列文章並不會談到太深的技術鑽研，而是希望以深入淺出的方式讓每一個想要搞懂區塊鏈技術的人都能在讀完後說出：原來如此！</blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ZZLyMlR2nxEX6eNYDE-kMg.png" /></figure><p>在<a href="https://medium.com/pelith/tokenhistory-dd67cf700b92">《上篇》</a>中我們談到從比特幣開始到以太坊 ERC-20 Token 出現的自定義代幣發展史。《下篇》將更著重在以太坊自定義代幣技術面的介紹，並展望到以太坊 2.0 Phase 1 相關的技術解析。</p><h3>代幣轉移的成本</h3><p>大家在<a href="https://medium.com/pelith/%E6%96%87%E7%B5%84%E4%B9%9F%E8%A9%B2%E7%9F%A5%E9%81%93%E7%9A%84%E5%8D%80%E5%A1%8A%E9%8F%88%E6%8A%80%E8%A1%93%E7%9F%A5%E8%AD%98-1-%E5%BE%9E%E4%B8%80%E7%AD%86%E4%BA%A4%E6%98%93%E4%BE%86%E7%9C%8Beth%E8%88%87btc%E4%B9%8B%E7%95%B0%E5%90%8C-15704d74be2c">第 1 節</a>中應該都了解到區塊鏈加密貨幣交易必須支付手續費給礦工，那麼既然「自定義代幣」要透過區塊鏈來進行傳輸，當我要發送代幣給別人，支付手續費給礦工也是很合乎邏輯的。</p><p>接著要解釋的部分會用到許多<a href="https://medium.com/pelith/howethsmartcontractwork-328bd8b9bb62">第 2 節</a>的概念，如果您還沒讀過，建議您先去閱讀，否則可能會有些難消化。</p><p>假設我（A）要把 10 個 Pelith Token（自定義代幣）轉給 B，其實是發生了什麼事呢？我簡單做了一張示意圖來說明。<br>（只做概念闡釋，省略了很多可以很複雜的中間細節）</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/960/1*3URCJXYbfCD3JkoIn9FytA.png" /></figure><p>首先要知道，在區塊鏈上發行代幣不是真的發行硬幣或發行鈔票，而是建立了一個<strong>「類 Excel 帳本」</strong>來<strong>紀錄誰擁有多少代幣</strong>。當我們進行代幣轉移時，只是更改這個帳本上格子裡的數字。</p><p>因此，當我透過智慧合約創造了 Pelith Token 時，建立了一個類似 Excel 的表格來追蹤所有 Pelith Token 持有者的持有數量，並且這些資料會以某種形式儲存備份在每一個節點中（對，就是在全節點那 200 G 左右裡）。</p><p>當我要把 10 個 Pelith Token 轉給 B 時，我必須發送一筆<strong>接收對象為合約地址</strong>的交易，礦工看到便知道我是要對智慧合約進行操作，不是一般發送 Ether 給別人的交易。並且在 Input Data 中呼叫我要操作動作的 function，輸入相對應的參數，大概會長類似下面這樣：</p><pre>我要call的function格式：<br><strong>function transfer(address to, uint256 value)<br></strong>[從我的地址傳送 uint256 value<em> </em>數量的代幣到 address to 錢包地址]</pre><pre>填入參數：<br><strong>transfer(0xB⋯⋯, 10)<br>→ transfer(0xB⋯⋯, 10000000000000000000)</strong></pre><pre>註：第三個參數 uint256_value 是 10 個 Pelith Token，不過因為在以太坊上沒有小數點，所以進入運算時要以 wei (10^-18，以太坊最小的單位)來進行，因此在10後面要補上18個0。</pre><pre>然後轉換成下面這個樣子：<strong><br></strong>0xa9059cbb000000000000000000000000B000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003b9aca00</pre><pre>再放入 Input Data 中。</pre><pre><strong>＊(0xB⋯⋯, 10) </strong>這一串 <strong>function 中的參數 </strong>稱為<strong> “Payload”</strong>（裝載的貨物）</pre><p>這些 Bytecode 被礦工驗證執行後，更新了「帳本內」對應地址的 Balance，隨後連同其它交易一起打包入新的區塊中。最先找到 Nonce 獲得出塊權利的礦工廣播給其它節點，直到各節點同步完成，並確認區塊在最長區塊鏈中，便正式驗證我（A）把 10 個 Pelith Token 轉給 B 了。</p><p>而以上這些動作，其實跟交易一樣須繳些許的 Ether 手續費給礦工。當你的 ERC-20 Token 要轉移給一個新的地址持有時（假設 B 過去未曾持有過 Pelith Token），我們在「帳本中」便必須要多開一個格子來記錄並追蹤這個地址的 Balance。</p><p>要「多開一個格子」的價格是 20,000 gas ；「更改一個現有格子內的數字」的價格是 5,000 gas，在這筆交易中一共更改了 A、B 兩格，故是 10,000 gas。再加上交易的基本手續費 21,000 gas。我執行了將 10 Pelith Token 轉給 B 的動作，總共花費了 51,000 gas。</p><pre>執行操作的 Gas 總花費計算：<br>20,000 gas ＋ 5,000*2 gas ＋ 21,000 gas ＝ 51,000 gas</pre><pre><strong>手續費（Eth）＝ Gas Used * Gas Price</strong><br>51,000 gas * 10 Gwei(fast) = 510,000 Gwei = 0.00051 ETH = 0.1 USD<br>（以 1 Ether = 200 USD 計算）<br>大約 3 塊台幣，便是更改一個格子大約需付出的手續費。</pre><p>（如果你看不懂上面灰色框框在幹嘛，那麼你可以在 <a href="https://medium.com/pelith/%E6%96%87%E7%B5%84%E4%B9%9F%E8%A9%B2%E7%9F%A5%E9%81%93%E7%9A%84%E5%8D%80%E5%A1%8A%E9%8F%88%E6%8A%80%E8%A1%93%E7%9F%A5%E8%AD%98-1-%E5%BE%9E%E4%B8%80%E7%AD%86%E4%BA%A4%E6%98%93%E4%BE%86%E7%9C%8Beth%E8%88%87btc%E4%B9%8B%E7%95%B0%E5%90%8C-15704d74be2c">第1節</a> 中找到資訊）</p><p>至此，我們知道了轉移 Token 須付出的手續費。如果轉移的量很大，其實金額也是有一定量的。並且，若你的 Token Transfer 交易無效，被彈掉時（例如你只有 10 個 Token 卻發了 20 個給別人），由於必須到礦工要改格子時才會觸發 error，但礦工已執行了這筆交易<strong>到觸發 error 為止的運算</strong>。故<strong>雖然交易失敗，手續費還是要付。</strong></p><h3>以太坊 2.0 與無頭合約</h3><p>最近隨著以太坊 2.0 有越來越多的消息釋出，出現了一個新名詞：「無頭合約」。原本在智慧合約，當我們從 Input Data 呼叫合約中的 function 後，合約中的程式碼便會執行邏輯運算去更新「帳本」內的 Balance。然而以太坊 2.0 的 Phase 1 並沒有 EVM，無法執行合約中的邏輯部分。因此<strong>發佈的合約中的 function </strong>會長下面這個樣子：</p><pre><strong>function transfer(address to, uint256 value) {<br>  }</strong></pre><p>原本 1.0 的合約 function 是長這個樣子：</p><pre>function transfer(address to, uint256 value) public returns (bool) {<br>        _transfer(msg.sender, to, value);<br>        return true;<br>    }</pre><p>這是什麼意思呢？就是當我們在 Input Data 中呼叫了合約中的 function，但 function 並不會真的去更新帳本上格子裡的 balance。因此這個合約只是個空殼，雖然看起來有東西，但實際上卻不會執行動作。</p><p>因此當我們發送 to 合約的交易，在 Input Data 中輸入了：</p><pre><strong>transfer(0xB⋯⋯, 10)</strong></pre><p>合約並不會真的更新帳本（因為根本沒有帳本的存在），也不會同步到其它的節點中。因此這些 Input Data 輸入的內容只是被當作一般的<strong>備註文字訊息</strong>被寫在 to 合約的交易中。於是呢，又回到了比特幣 Omni Layer 的做法，我必須要去爬這些所有的<strong>「便條紙」</strong>上的資訊，才會知道最新各地址的餘額狀態。也因此，我們發送呼叫這個合約的交易，因為不會進行邏輯執行，所以實際上可以省下非常多的 gas，只需要付出交易的基本手續費 21,000 gas 加上些許的文字寫入 gas 費用。</p><p>我們回顧到目前為止 <a href="https://medium.com/pelith/tagged/course">4 節</a> 的內容，可以發現區塊鏈從 1.0 的比特幣，到 2.0 的以太坊，最大的升級便是智慧合約的功能，允許開發者可以客製化開發許多需要的功能。</p><h3>《下篇》結論</h3><ol><li>在區塊鏈上發行代幣不是真的發行硬幣或發行鈔票，而是建立了一個<strong>「類 Excel 帳本」</strong>來<strong>紀錄誰擁有多少代幣</strong></li><li>代幣轉移時必須發送一筆接收地址為合約地址的交易，並在 Input Data 中<strong>呼叫合約中的 function </strong>進行操作，並付出相應的運算成本給礦工。</li><li>以太坊 2.0 的 Phase 1 中由於沒有邏輯執行的功能，因此智慧合約都成了<strong>「無頭合約」</strong>，讓以太坊 2.0 再次被當作如 Omni Layer 般的<strong>「便條紙」</strong>來使用。</li></ol><p>好！介紹至此，大家應該對於區塊鏈上的代幣在技術面有更深一層的認知。<a href="https://medium.com/pelith/behindtheethtransaction-534dc6ce123e?sk=996607b64b68138c30efe7f1d3976986">下一節</a> 我們將來介紹更多的以太坊技術細節，包括以太坊交易為何會塞車？為什麼要有區塊大小的限制？也會更清楚地說明許多前面有提到但解釋不夠清楚的地方。謝謝大家！</p><p>傳送門：<a href="https://medium.com/pelith/behindtheethtransaction-534dc6ce123e?sk=996607b64b68138c30efe7f1d3976986">文組也該知道的區塊鏈技術知識 &lt;5&gt; 不可不知的以太坊交易打包規則</a></p><p>以上，若有任何</p><p><strong>A. 我寫得不夠清楚的地方<br>B. 撰寫上改進的建議<br>C. 希望我能夠撰寫分享的區塊鏈技術知識內容</strong></p><p>都非常歡迎在底下留言回覆。希望我的文章能幫助到更多像我一樣想學習區塊鏈技術與知識的朋友。如果您覺得讀完有所收穫，也希望能<br><strong>＊不吝嗇給我 Like / 50 claps<br>＊分享給您的朋友們<br></strong>謝謝大家！</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fbutton.like.co%2Fin%2Fembed%2Flaijack%2Fbutton%2F&amp;url=https%3A%2F%2Fbutton.like.co%2Flaijack&amp;image=https%3A%2F%2Fstorage.googleapis.com%2Flikecoin-foundation.appspot.com%2Flikecoin_store_user_laijack_main%3FGoogleAccessId%3Dfirebase-adminsdk-eyzut%2540likecoin-foundation.iam.gserviceaccount.com%26Expires%3D2430432000%26Signature%3DUFpz8RkTS%252FPM4LxQe9kKtpAnbs5WAgVdgjw91Hh6xXYviAAtDT2q9U1yoliTe881LuT%252FZtbgXCV8CjdWFYmj105e1%252Bk434yyzFhV3Yw5j8Po%252Bcin0lQQ7K5E13rwPUdN3vlAopvmZoWvG9GUIOY%252FrfPeWPLidhHNo0JRO%252FMJovmwA4C4GLao4v2AG%252FGBPMxtkK2wWyvgpopP9JhVtYqxFAamXr5RAbGd5CSdArfpK9GpqmytALhkDYvZ1RW%252BUf%252Fi7T17N7rTnhOKsmJ0mmMyTr4azasH8ewTh5ZxXE9CUb5f812gsleztbJvBs3ZXak1lwiDjWNdlJnpFIoVwpUi9Q%253D%253D&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=like" width="485" height="212" frameborder="0" scrolling="no"><a href="https://medium.com/media/eb8d8771f4ee83287095f9542ab9f5ad/href">https://medium.com/media/eb8d8771f4ee83287095f9542ab9f5ad/href</a></iframe><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=b29971bac999" width="1" height="1" alt=""><hr><p><a href="https://medium.com/pelith/tokenhistory2-b29971bac999">文組也該知道的區塊鏈技術知識 &lt;4&gt; 從染色幣到無頭合約的代幣演進史《下篇》</a> was originally published in <a href="https://medium.com/pelith">Pelith</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[文組也該知道的區塊鏈技術知識 <3> 從染色幣到無頭合約的代幣演進史《上篇》]]></title>
            <link>https://medium.com/pelith/tokenhistory-dd67cf700b92?source=rss-c5fae3649355------2</link>
            <guid isPermaLink="false">https://medium.com/p/dd67cf700b92</guid>
            <category><![CDATA[blockchain]]></category>
            <category><![CDATA[course]]></category>
            <category><![CDATA[bitcoin]]></category>
            <category><![CDATA[token]]></category>
            <category><![CDATA[ethereum]]></category>
            <dc:creator><![CDATA[Vins Lai @vins.ton]]></dc:creator>
            <pubDate>Mon, 26 Aug 2019 03:26:08 GMT</pubDate>
            <atom:updated>2019-11-26T06:34:01.655Z</atom:updated>
            <content:encoded><![CDATA[<h3>文組也該知道的區塊鏈技術知識 &lt;3&gt; 從染色幣到無頭合約的代幣演進史 《上篇》</h3><h4>Blockchain Technical Overview &lt;3&gt; The History of Token ( Part 1 )</h4><blockquote>收看本系列文章的讀者，應該都對於區塊鏈的基本原理和架構有些概念，如果沒有，推薦您先去 Google 搜尋 <strong>區塊鏈、比特幣、以太坊</strong>這些關鍵字了解一下。我們將在這些基礎概念之上，來談區塊鏈的技術知識。本系列文章並不會談到太深的技術鑽研，而是希望以深入淺出的方式讓每一個想要搞懂區塊鏈技術的人都能在讀完後說出：原來如此！</blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*9wUQlsuiCNFpo9e3jHbbTw.png" /></figure><p>在<a href="https://medium.com/pelith/tagged/course"><strong>前兩節</strong></a>的內容我們從交易開始認識比特幣及以太坊的基礎架構，隨後介紹了以太坊智慧合約運作的概念。第三節我們將來回顧區塊鏈<strong>「代幣」</strong>演進的歷史，並解析與之相關的技術。由於內容豐富，為避免讀者閱讀上的負擔，會分成上、下兩個篇章來闡述。</p><p>既然要談代幣，就必須先釐清代幣的定義。用比喻來說明的話，我們現實世界中有各國發行流通的法幣，如：台幣（NTD）、美金（USD）。然而，有些公司為了便於平台管理或流通便利性等因素，會發行在平台流通的「代幣」，如：湯姆熊幣、Line Points。</p><p>在區塊鏈的世界裡，其實也存在類似的概念，在公鏈上流通的加密貨幣如：比特幣（BTC）、以太幣（ETH），就像是各國的法幣，普遍被稱之為「協議代幣」（在比特幣/以太坊協議下流通的代幣）。然而，在以太坊上我們可以透過智慧合約客製化來創造出類似於代幣性質的產物，可稱之為「自定義代幣」，透過智慧合約來賦予代幣功能，類似我們傳統上理解的代幣。</p><p><strong>「協議代幣」</strong>與<strong>「自定義代幣」</strong>我們都稱為加密貨幣（Cryptocurrency）。而<strong>「協議代幣」往往有自己的區塊鏈或類似的分散式帳本技術</strong>，不需要任何其它區塊鏈就能獨立運作。而<strong>「自定義代幣」則是利用現有的區塊鏈</strong>（絕大多數是 Ethereum），透過智慧合約或其它方式來發行及運行。</p><p>本文主要是以<strong>「自定義代幣」</strong>為主題來介紹。</p><p>2017 年的 ICO 浪潮開啟了大發幣時代，人人都能在以太坊區塊鏈上發行自己的代幣。但其實在以太坊上線之前便已有區塊鏈代幣（以下簡稱代幣）的存在。</p><h3>區塊鏈代幣的起源：染色幣（Colored Coin）</h3><p>代幣的歷史最早可以溯及到比特幣上的<strong>染色幣</strong>。但比特幣沒有智慧合約，要如何發幣呢？當時鑄造 Token 的做法是：我們把 1 Satoshi (10^-8個 Bitcoin) 重新定義為 1 USD。如此一來，1 Bitcoin (100 Million Satoshi ) 的價值便變成了 100M USD。然而這樣的做法必須具有公信力，因此鑄造的機構應該要<strong>抵押</strong> 100M 的 USD 來<strong>擔保</strong>這 100M 的 Satoshi 具有等值 100M USD 的價值（但沒有機制保證鑄造機構真的有抵押）。於是我們會說這些比特幣被<strong>染色</strong>了，因為它代表的不再是比特幣的帳面價值，而被賦予了新的價值意義，只是這個 Token <strong>透過比特幣的區塊鏈網絡來進行流通</strong>。我發送給你 100 Satoshi，其實是發送給你 100 USD。</p><p>但這 100M 的染色幣要怎麼跟其它比特幣來區隔呢？於是許多鑄造商會再利用一個<strong>比特幣外部的帳本</strong>來追蹤這 100M Satoshi 的交易紀錄，如此來確認誰手上具有這些<strong>被「染色」的 Satoshi</strong>，他們有權利可以用這些 Satoshi 兌換為美金。此外，在比特幣 UTXO 的架構下，若是同時交易了染色幣與比特幣，該怎麼區分哪些是有染色的 Satoshi 呢？一種可能的做法是：一筆交易的Output 中在前的錢堆是染色幣；在後的錢堆則是比特幣。<br>（<a href="https://medium.com/pelith/%E6%96%87%E7%B5%84%E4%B9%9F%E8%A9%B2%E7%9F%A5%E9%81%93%E7%9A%84%E5%8D%80%E5%A1%8A%E9%8F%88%E6%8A%80%E8%A1%93%E7%9F%A5%E8%AD%98-1-%E5%BE%9E%E4%B8%80%E7%AD%86%E4%BA%A4%E6%98%93%E4%BE%86%E7%9C%8Beth%E8%88%87btc%E4%B9%8B%E7%95%B0%E5%90%8C-15704d74be2c">不了解 UTXO 架構的讀者傳送門</a>）</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/960/1*g1repmbUzRsp38oQQbaMAA.png" /><figcaption>染色幣交易示意圖</figcaption></figure><p>以上，便是最古早鑄造的 Token 的作法。這個作法主要的缺點是：當你把這 1 顆 Bitcoin 染色，也代表你<strong>失去</strong>了這 1 Bitcoin（因為這 1 Bitcoin 被當作其它的用途了）。並且當你要交易 300 美金（ 300 Satoshi ）給別人時，卻必須付出遠大於 300 Satoshi 的<strong>手續費</strong>給礦工，所以其實很少人這樣子鑄造。在 2017 年幣價突破天際後，便幾乎沒人再這樣鑄造了。</p><h3>USDT 與 Omni Layer</h3><p>接下來的作法，便是由 Tether 公司發行，赫赫有名的第一代 USDT。第一代 USDT 是建構在比特幣上，採用 Omni Layer 的技術。做法是在比特幣上發送交易，然而交易本身不是重點，重點是在交易的 OP_RETURN 中寫下訊息。如：地址 A 給地址 B &lt;10 USDT&gt;，地址 B 便可以再給地址 C &lt;4 USDT&gt;、給地址 D &lt;2 USDT&gt;。如此不斷的接續下去，就像是<strong>把比特幣當作便條紙來使用一般</strong>，僅是利用比特幣的 OP_RETURN 內容會永久存在區塊鏈上的特性來記錄 USDT 的流通。</p><p>然而，若是一個地址 A 並沒有持有 USDT，但他卻寫下了給 B &lt;10 USDT&gt;，這樣具有效力嗎？於是，Omni Layer 便另外<strong>建立了一個 Explorer 來追蹤</strong>這些所有 Bitcoin 交易上 OP_RETURN 內的 Omni 訊息，藉以得知每個地址持有的 USDT。若是有地址寫下了無效的交易訊息將被自動濾掉。</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*VU15hyQbGSD_LWrhKx8LGA.png" /><figcaption>含有 omni 訊息的交易 OP_RETURN</figcaption></figure><h3>以太坊 ERC-20 Token</h3><p>以上便是在比特幣上發行 Token 常見的作法。接下來進入到以太坊的世界，由於智慧合約功能的出現，一切都變得簡單了些。ERC-20 Token 是至今最常見的代幣，那麼 ERC-20 是什麼？ERC-20 Token 是怎麼鑄造出來的呢？</p><p>ERC-20 是<a href="https://theethereum.wiki/w/index.php/ERC20_Token_Standard"><strong>以太坊上發行代幣的協定規範</strong></a>，約定發行的代幣必須<strong>包含的資訊</strong>（如發行幾顆）以及代幣<strong>具有的功能</strong>（如發送與接收）和<strong>限制</strong>（如一定時間內能從錢包提領的上限）等，並且會在以太坊上建立資料庫來記錄每個地址持有的代幣數量。</p><p>舉例來說，我今天想要發行一個 ERC-20 Token，取名叫 Pelith Token。假設想發行一百萬顆，要怎麼做到呢？</p><p>用最直白的方式來說，就是要寫一個 ERC-20 代幣發行規範的智慧合約，並在發行量這段程式碼中寫一百萬顆，接著把這個智慧合約放入一筆交易的 Input Data 中，交易的接收地址填為 0x0，被礦工執行部署完成後，一百萬顆 Pelith Token 便誕生了。所以說，<strong>代幣的創造在技術上是非常容易的</strong>，無論想要發行一百萬顆、一億顆、十億顆，其實都只是<strong>智慧合約內改個數字的差別，發行量的變動成本趨近於零。</strong>所以 2017 年的 ICO 浪潮，才會出現這麼多各式各樣的 shitcoin，只要寫個智慧合約和白皮書，一個代幣就此誕生了，可以開始圈錢。啊！不是，是募資。<br>（<a href="https://medium.com/pelith/howethsmartcontractwork-328bd8b9bb62">不了解智慧合約架構的讀者傳送門</a>）</p><p>真正的難處往往是代幣發行後實際的應用場景搭建和社群行銷營運，讓這個代幣被認可、讓人願意持有及應用才是最大的困難點和成本之所在。</p><h3>《上篇》結論</h3><ol><li><strong>「協議代幣」</strong>往往<strong>有自己的區塊鏈或類似的分散式帳本技術</strong>，而<strong>「自定義代幣」</strong>則是<strong>利用現有的區塊鏈來發行及運行</strong>。</li><li>早期比特幣上常見的代幣有<strong>改變單位定義的染色幣</strong>與<strong>把比特幣作為便條紙的 Omni Layer</strong> 兩種做法。</li><li>以太坊與智慧合約的出現讓發行代幣在技術門檻上變得更簡易且更有統一的規範，然而應用場景搭建與社群行銷營運才是真正難處。</li></ol><p>好，先分享至此，上篇中大致帶過了流變的脈絡，<a href="https://medium.com/pelith/tokenhistory2-b29971bac999">《下篇》</a>我們將更著重在技術面的介紹。</p><p>傳送門：<a href="https://medium.com/pelith/tokenhistory2-b29971bac999">文組也該知道的區塊鏈技術知識 &lt;4&gt; 從染色幣到無頭合約的代幣演進史 《下篇》</a></p><p>以上，若有任何</p><p><strong>A. 我寫得不夠清楚的地方<br>B. 撰寫上改進的建議<br>C. 希望我能夠撰寫分享的區塊鏈技術知識內容</strong></p><p>都非常歡迎在底下留言回覆。希望我的文章能幫助到更多像我一樣想學習區塊鏈技術與知識的朋友。如果您覺得讀完有所收穫，也希望能<br><strong>＊不吝嗇給我 Like / 50 claps<br>＊分享給您的朋友們<br></strong>謝謝大家！</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fbutton.like.co%2Fin%2Fembed%2Flaijack%2Fbutton%2F&amp;url=https%3A%2F%2Fbutton.like.co%2Flaijack&amp;image=https%3A%2F%2Fstorage.googleapis.com%2Flikecoin-foundation.appspot.com%2Flikecoin_store_user_laijack_main%3FGoogleAccessId%3Dfirebase-adminsdk-eyzut%2540likecoin-foundation.iam.gserviceaccount.com%26Expires%3D2430432000%26Signature%3DUFpz8RkTS%252FPM4LxQe9kKtpAnbs5WAgVdgjw91Hh6xXYviAAtDT2q9U1yoliTe881LuT%252FZtbgXCV8CjdWFYmj105e1%252Bk434yyzFhV3Yw5j8Po%252Bcin0lQQ7K5E13rwPUdN3vlAopvmZoWvG9GUIOY%252FrfPeWPLidhHNo0JRO%252FMJovmwA4C4GLao4v2AG%252FGBPMxtkK2wWyvgpopP9JhVtYqxFAamXr5RAbGd5CSdArfpK9GpqmytALhkDYvZ1RW%252BUf%252Fi7T17N7rTnhOKsmJ0mmMyTr4azasH8ewTh5ZxXE9CUb5f812gsleztbJvBs3ZXak1lwiDjWNdlJnpFIoVwpUi9Q%253D%253D&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=like" width="485" height="212" frameborder="0" scrolling="no"><a href="https://medium.com/media/eb8d8771f4ee83287095f9542ab9f5ad/href">https://medium.com/media/eb8d8771f4ee83287095f9542ab9f5ad/href</a></iframe><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=dd67cf700b92" width="1" height="1" alt=""><hr><p><a href="https://medium.com/pelith/tokenhistory-dd67cf700b92">文組也該知道的區塊鏈技術知識 &lt;3&gt; 從染色幣到無頭合約的代幣演進史《上篇》</a> was originally published in <a href="https://medium.com/pelith">Pelith</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
    </channel>
</rss>