本文作者為賴彥廷,於區塊鏈解決方案服務商 Pelith 沛理科技擔任專案經理,本系列文章並不會談到太深的技術鑽研,而是以深入淺出的方式,讓每一個想要了解區塊鏈技術的讀者,都可以在讀完後說出:原來如此!
在《上篇》中我們談到從比特幣開始到以太坊 ERC-20 Token 出現的自定義代幣發展史。《下篇》將更著重在以太坊技術面的介紹,並在最後綜觀代幣演進發展史給予一些觀點評論。
代幣轉移的成本
大家在第 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格式: transferFrom(address _from, address _to, uint256 _value) [從address _from傳送 _value 數量的代幣到 _to錢包地址]填入參數:transferFrom(0xA⋯⋯, 0xB⋯⋯, 10) → transferFrom(0xA⋯⋯, 0xB⋯⋯, 10000000000000000000) 註:第三個參數 uint256_value 是 10 個 Pelith Token,不過因為在以太坊上沒有小數點,所以進入運算時要以 wei (10^-18,以太坊最小的單位)來進行,因此在10後面要補上18個0。然後轉換成類似下面這個樣子: 0x23b872dd000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000008ac7230489e80000 再放入 Input Data 中。*(0xA⋯⋯, 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 會長下面這個樣子:
transferFrom(address _from, address _to, uint256 _value) {
}
原本 1.0 的合約 function 是長這個樣子:
transferFrom(address _from, address _to, uint256 _value)returns (bool) {
balances[_from] = balances[_from].sub(_value);
balances[_to] = balances[_to].add(_value);
emit Transfer(_from, _to, _value);
return true;
}
這是什麼意思呢?就是當我們在 Input Data 中呼叫了合約中的 function,但 function 並不會真的去更新帳本上格子裡的 balance。因此這個合約只是個空殼,雖然看起來有東西,但實際上卻不會執行動作。
因此當我們發送 to 合約的交易,在 Input Data 中輸入 :
transferFrom(0xA⋯⋯, 0xB⋯⋯, 10)
合約並不會真的更新帳本(因為根本沒有帳本的存在),也不會同步到其它的節點中。因此這些 Input Data 輸入的內容只是被當作一般的備註文字訊息被寫在 to 合約的交易中。於是呢,又回到了比特幣 Omni Layer 的做法,我必須要去爬這些所有的「便條紙」上的資訊,才會知道最新各地址的餘額狀態。也因此,我們發送呼叫這個合約的交易,因為不會進行邏輯執行,所以實際上可以省下非常多的 gas,只需要付出交易的基本手續費 21,000 gas 加上些許的文字寫入 gas 費用。
我們回顧到目前為止 4 節 的內容,可以發現區塊鏈從 1.0 的比特幣,到 2.0 的以太坊,最大的升級便是智慧合約的功能,允許開發者可以客製化開發許多需要的功能。
《下篇》結論
- 在區塊鏈上發行代幣不是真的發行硬幣或發行鈔票,而是建立了一個「類 Excel 帳本」來紀錄誰擁有多少代幣
- 代幣轉移時必須發送一筆接收地址為合約地址的交易,並在 Input Data 中呼叫合約中的 function 進行操作,並付出相應的運算成本給礦工。
- 以太坊 2.0 的 Phase 1 中由於沒有邏輯執行的功能,因此智慧合約都成了「無頭合約」,讓以太坊 2.0 再次被當作如 Omni Layer 般的「便條紙」來使用。
?相關報導?
文組也該知道的區塊鏈技術知識《2》:一次搞懂「以太坊智慧合約」如何運作
文組也該知道的區塊鏈技術知識《1》 從一筆交易來看 ETH 與 BTC 之異同
《BlockTempo動區動趨》LINE官方號開通囉~立即加入獲得第一手區塊鏈、加密貨幣新聞報導!