文組也該知道的區塊鏈技術知識 <4> 從染色幣到無頭合約的代幣演進史 《下篇》

Blockchain Technical Overview <4> The History of Token ( Part 2 )

Vins Lai @vins.ton
Pelith
8 min readSep 2, 2019

--

收看本系列文章的讀者,應該都對於區塊鏈的基本原理和架構有些概念,如果沒有,推薦您先去 Google 搜尋 區塊鏈、比特幣、以太坊這些關鍵字了解一下。我們將在這些基礎概念之上,來談區塊鏈的技術知識。本系列文章並不會談到太深的技術鑽研,而是希望以深入淺出的方式讓每一個想要搞懂區塊鏈技術的人都能在讀完後說出:原來如此!

《上篇》中我們談到從比特幣開始到以太坊 ERC-20 Token 出現的自定義代幣發展史。《下篇》將更著重在以太坊自定義代幣技術面的介紹,並展望到以太坊 2.0 Phase 1 相關的技術解析。

代幣轉移的成本

大家在第 1 節中應該都了解到區塊鏈加密貨幣交易必須支付手續費給礦工,那麼既然「自定義代幣」要透過區塊鏈來進行傳輸,當我要發送代幣給別人,支付手續費給礦工也是很合乎邏輯的。

接著要解釋的部分會用到許多第 2 節的概念,如果您還沒讀過,建議您先去閱讀,否則可能會有些難消化。

假設我(A)要把 10 個 Pelith Token(自定義代幣)轉給 B,其實是發生了什麼事呢?我簡單做了一張示意圖來說明。
(只做概念闡釋,省略了很多可以很複雜的中間細節)

首先要知道,在區塊鏈上發行代幣不是真的發行硬幣或發行鈔票,而是建立了一個「類 Excel 帳本」紀錄誰擁有多少代幣。當我們進行代幣轉移時,只是更改這個帳本上格子裡的數字。

因此,當我透過智慧合約創造了 Pelith Token 時,建立了一個類似 Excel 的表格來追蹤所有 Pelith Token 持有者的持有數量,並且這些資料會以某種形式儲存備份在每一個節點中(對,就是在全節點那 200 G 左右裡)。

當我要把 10 個 Pelith Token 轉給 B 時,我必須發送一筆接收對象為合約地址的交易,礦工看到便知道我是要對智慧合約進行操作,不是一般發送 Ether 給別人的交易。並且在 Input Data 中呼叫我要操作動作的 function,輸入相對應的參數,大概會長類似下面這樣:

我要call的function格式:
function transfer(address to, uint256 value)
[從我的地址傳送 uint256 value 數量的代幣到 address to 錢包地址]
填入參數:
transfer(0xB⋯⋯, 10)
→ transfer(0xB⋯⋯, 10000000000000000000)
註:第三個參數 uint256_value 是 10 個 Pelith Token,不過因為在以太坊上沒有小數點,所以進入運算時要以 wei (10^-18,以太坊最小的單位)來進行,因此在10後面要補上18個0。然後轉換成下面這個樣子:
0xa9059cbb000000000000000000000000B000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003b9aca00
再放入 Input Data 中。*(0xB⋯⋯, 10) 這一串 function 中的參數 稱為 “Payload”(裝載的貨物)

這些 Bytecode 被礦工驗證執行後,更新了「帳本內」對應地址的 Balance,隨後連同其它交易一起打包入新的區塊中。最先找到 Nonce 獲得出塊權利的礦工廣播給其它節點,直到各節點同步完成,並確認區塊在最長區塊鏈中,便正式驗證我(A)把 10 個 Pelith Token 轉給 B 了。

而以上這些動作,其實跟交易一樣須繳些許的 Ether 手續費給礦工。當你的 ERC-20 Token 要轉移給一個新的地址持有時(假設 B 過去未曾持有過 Pelith Token),我們在「帳本中」便必須要多開一個格子來記錄並追蹤這個地址的 Balance。

要「多開一個格子」的價格是 20,000 gas ;「更改一個現有格子內的數字」的價格是 5,000 gas,在這筆交易中一共更改了 A、B 兩格,故是 10,000 gas。再加上交易的基本手續費 21,000 gas。我執行了將 10 Pelith Token 轉給 B 的動作,總共花費了 51,000 gas。

執行操作的 Gas 總花費計算:
20,000 gas + 5,000*2 gas + 21,000 gas = 51,000 gas
手續費(Eth)= Gas Used * Gas Price
51,000 gas * 10 Gwei(fast) = 510,000 Gwei = 0.00051 ETH = 0.1 USD
(以 1 Ether = 200 USD 計算)
大約 3 塊台幣,便是更改一個格子大約需付出的手續費。

(如果你看不懂上面灰色框框在幹嘛,那麼你可以在 第1節 中找到資訊)

至此,我們知道了轉移 Token 須付出的手續費。如果轉移的量很大,其實金額也是有一定量的。並且,若你的 Token Transfer 交易無效,被彈掉時(例如你只有 10 個 Token 卻發了 20 個給別人),由於必須到礦工要改格子時才會觸發 error,但礦工已執行了這筆交易到觸發 error 為止的運算。故雖然交易失敗,手續費還是要付。

以太坊 2.0 與無頭合約

最近隨著以太坊 2.0 有越來越多的消息釋出,出現了一個新名詞:「無頭合約」。原本在智慧合約,當我們從 Input Data 呼叫合約中的 function 後,合約中的程式碼便會執行邏輯運算去更新「帳本」內的 Balance。然而以太坊 2.0 的 Phase 1 並沒有 EVM,無法執行合約中的邏輯部分。因此發佈的合約中的 function 會長下面這個樣子:

function transfer(address to, uint256 value) {
}

原本 1.0 的合約 function 是長這個樣子:

function transfer(address to, uint256 value) public returns (bool) {
_transfer(msg.sender, to, value);
return true;
}

這是什麼意思呢?就是當我們在 Input Data 中呼叫了合約中的 function,但 function 並不會真的去更新帳本上格子裡的 balance。因此這個合約只是個空殼,雖然看起來有東西,但實際上卻不會執行動作。

因此當我們發送 to 合約的交易,在 Input Data 中輸入了:

transfer(0xB⋯⋯, 10)

合約並不會真的更新帳本(因為根本沒有帳本的存在),也不會同步到其它的節點中。因此這些 Input Data 輸入的內容只是被當作一般的備註文字訊息被寫在 to 合約的交易中。於是呢,又回到了比特幣 Omni Layer 的做法,我必須要去爬這些所有的「便條紙」上的資訊,才會知道最新各地址的餘額狀態。也因此,我們發送呼叫這個合約的交易,因為不會進行邏輯執行,所以實際上可以省下非常多的 gas,只需要付出交易的基本手續費 21,000 gas 加上些許的文字寫入 gas 費用。

我們回顧到目前為止 4 節 的內容,可以發現區塊鏈從 1.0 的比特幣,到 2.0 的以太坊,最大的升級便是智慧合約的功能,允許開發者可以客製化開發許多需要的功能。

《下篇》結論

  1. 在區塊鏈上發行代幣不是真的發行硬幣或發行鈔票,而是建立了一個「類 Excel 帳本」紀錄誰擁有多少代幣
  2. 代幣轉移時必須發送一筆接收地址為合約地址的交易,並在 Input Data 中呼叫合約中的 function 進行操作,並付出相應的運算成本給礦工。
  3. 以太坊 2.0 的 Phase 1 中由於沒有邏輯執行的功能,因此智慧合約都成了「無頭合約」,讓以太坊 2.0 再次被當作如 Omni Layer 般的「便條紙」來使用。

好!介紹至此,大家應該對於區塊鏈上的代幣在技術面有更深一層的認知。下一節 我們將來介紹更多的以太坊技術細節,包括以太坊交易為何會塞車?為什麼要有區塊大小的限制?也會更清楚地說明許多前面有提到但解釋不夠清楚的地方。謝謝大家!

傳送門:文組也該知道的區塊鏈技術知識 <5> 不可不知的以太坊交易打包規則

以上,若有任何

A. 我寫得不夠清楚的地方
B. 撰寫上改進的建議
C. 希望我能夠撰寫分享的區塊鏈技術知識內容

都非常歡迎在底下留言回覆。希望我的文章能幫助到更多像我一樣想學習區塊鏈技術與知識的朋友。如果您覺得讀完有所收穫,也希望能
*不吝嗇給我 Like / 50 claps
*分享給您的朋友們
謝謝大家!

--

--

Vins Lai @vins.ton
Pelith
Editor for

Co-Founder of Aurora Card - World's First Crypto Credit Card built on Trust with supreme Privacy, sign up: https://app.aurora-card.com/signup?userRef=N527Zi