在以太坊世界中, 當我們發起一筆轉賬交易, 可以從 Etherscan 這樣的以太坊區塊鏈瀏覽器上搜索查看交易的詳細信息, 我在之前有寫過詳細的關於 Etherscan 的使用教程, 那麼今天, 讓我們來到比特幣的世界, 學習如何使用 Blockchain.info 來查詢比特幣的交易。
前言
1. 什麼是 UTXO 機制
為了方便大家理解後續 Blockchain 上所顯示的內容, 我們還是要首先講解一下 UTXO 機制, 這也是比特幣和以太坊的一個重要的區別。UTXO 代表 Unspent Transaction Output, 它是比特幣交易的基本單位是未經使用的一個交易輸出[1]。UTXO 是不能再分割、被所有者鎖住的或記錄於區塊鏈中的並被整個網絡識別成貨幣單位的一定量的比特幣[2]。
舉一個很詳細的例子來說明, 小明的媽媽想去買兩瓶醬油, 一瓶醬油的價格是 6 元錢, 但是由於小明的媽媽需要在家做飯, 所以委託小明去商店購買, 小明的媽媽給小明 1 張 10 元, 一張 5 元, 和 一張 1 元, 並承諾其中的 1 元錢做為小明的 “跑腿費”。於是小明將 1 元錢先 “納入麾下”, 然後到商店, 將 15 元給到售貨員, 換取兩瓶醬油花費 12 元。售貨員找回 3 元錢, 小明回到家將三元錢還給媽媽。
在這個故事中, 10 元和 5 元屬於小明媽媽的 output[注1], 而對於小明來說, 他充當的是 礦工的角色, 所以小明媽媽給小明的 1 元錢是礦工費, 而對於商店售貨員來說, 他的 12 塊錢是 input, 而找回的 3 元錢, 對於小明媽媽而言, 就是 UTXO。
這裡還要提到有趣的一點, 就是上述小明媽媽最初拿出的 10 元和 5 元分別是一個 UTXO, 是小明媽媽在買其他貨物的時候, 作為找零獲得的。並且 10 元和 5 元都是不可分割的。同時如果一個 UTXO 比一筆交易所需數量大, 它仍會被當做一個整體而消耗掉, 但是同時會在交易中生成零頭。
圖1-1
2. 比特幣找零地址
上述這個故事中, 有一個概念我們要著重講解一下, 就是 “找零機制”。首先我們要知道, 找零地址可以是我們之前使用的地址 (即轉賬地址), 也可以是新的地址。如果我們在轉賬的時候, 不設置找零地址的話, 那麼所有的 “找零” 都將支付給礦工。在上述例子中, 如果小明買完醬油之後, 小明的媽媽忘記向小明要回找零的 3 元錢, 那這筆錢是不是就被小明 “私吞” 了呢? 同樣, 如果你有 100 個 BTC, 轉賬給朋友 1 個 BTC之後, 忘記設定找零地址, 那麼剩下的 99 個 BTC 將全部 “無償” 捐獻給打包這筆交易的礦工。聽上去是不是很可怕?
但是, imToken 的用戶則無需擔心忘記設置找零地址, 因為 imToken 已經自動幫你完成這一切, 即每次轉賬都會新為你生成一個找零地址[注2]。
那麼有的人會問道, 為什麼每次都要生成一個新的地址, 用於接收找零代幣? 直接使用原地址接收找零不好嗎? 這個問題我們會在下邊談到。
基礎篇
3. 如何查詢轉賬地址信息
如果你對上述概念還是一知半解, 沒有關係, 我通過實戰操作再來幫助你深入理解。打開 https://blockchain.info 網站, 輸入你的 BTC 轉賬地址, 點擊 Search 按鈕, 進行查詢。
圖 3-1
這裡可以看到, 我當前地址曾經一共收到過 0.01 個BTC (Total Received 所顯示), 但是由於我使用 imToken 發起過一次轉賬交易, 所以當前的地址中所剩 BTC 為 0 (Final Balance 所顯示)。
這裡有一個問題, 我當前地址本來有 0.01 個 BTC, 而我只轉出 0.001 個 BTC, 為什麼當前地址餘額變成了 0 ?
其實這就是文章開篇提到的比特幣 UTXO 機制, 比特幣為了安全性和匿名性, 可以在每次使用一個地址轉賬過後, 將 “找零” 轉向新的地址。可以看到圖 3-2 的 Transactions 類目下一筆轉賬交易竟然出現兩個 “收款地址”, 一個是真正的轉賬目標地址, 另一個則是找零地址。但是我們單從地址上無法分辨到底哪個是找零地址, 哪個是轉賬地址, 只能通過已知哪個是目標地址, 然後使用排除法判斷。但通過我測試, 一般情況下第一個都是轉賬地址, 第二個為找零地址 (多筆轉賬不適宜)。
圖 3-2
4. 如何查詢交易是否成功
如圖 4-1, 我使用 imToken 中生成的 BTC 地址 19Fbiok5SuP7YWReGDwMp
77tfx1vVDVih1 向 1Aqyai7gLr44DPmPdW3S24YeEKfiiW9foV 地址轉賬0.0009 個 BTC, 這時候交易屬於 Uncomfirmed Transaction 轉賬, 也就是說還沒有礦工確認打包。 BTC 和以太坊目前都是 POW 機制, 即交易需要礦工打包確認。不同的是, 以太坊的出塊速度是 15 秒, 而比特幣需要 10 分鐘。
圖 4-1
我們普遍認為確認一筆比特幣交易確認需要 6 個區塊確認, 但是一般情況下只要看到 1 個區塊確認, 即 1 Comfirmation(如圖 3-2), 就基本可以確定這筆交易成功了, 同時也可以使用 imToken 查看到餘額的變化。
圖 4-2
5. 如何查詢礦工費
比特幣和以太坊一樣, 轉賬也需要支付足夠的礦工費。比特幣的最小計數單位是 “聰” (Satoshi, 簡稱 sat)。其實在比特幣的底層協議中, 並沒有規定每筆交易的礦工費需要多少, 只是要求地址中總輸入(input)不小於總輸出(output), 所以從理論上來說, 如果一筆轉賬交易不支付礦工費, 也是會被礦工打包, 並且交易成功, 但是時間確是不確定的, 有可能會等上很多年。
目前比特幣的轉賬礦工費, 是按照交易數據字節大小和 input 以及 output 的數量來來確定的。數據越大, 交易數量越多, 礦工費越多。一般情況下每筆交易的字節數在 200 ~ 300 bytes, 而每個 bit 你所願意支付的費用可以自定義, 例如使用 imToken 設置 20 sat/b, 以圖 5-1 為例。
圖 5-1
這筆交易的數據大小是 226 bytes, 而我設置的礦工費是 20 sat/b, 所以我消耗的礦工費是 gas fee = 226 * 20 * 10e-8, 大約是 0.0000452 個 BTC。
但其實絕大多數錢包服務商在計算用戶交易礦工費的時候, 是提前估算好的, 所以會存在一些偏差。
進階篇
6. From -> To OR Input -> Output
用戶在使用 Blockchain 查詢 BTC 交易的時候, 會發現很多和使用 Ethereum 的不同之處。因為以太坊屬於 account 模型, 它是 “From -> To“ 結構, 我們發起轉賬時, 每一個 TxId 都包含一個付款地址和一個收款地址。
而比特幣則不然, 它是 UTXO 機制, 即多個 input 可以對應多個 output[注3], 大家可以回憶一下開篇我們講到的故事, 小明的媽媽給小明 10 元和 5 元, 這是兩個 output, 而 input 是 12 元, 但我們可以認為 12 元其實是多個 input, 包括給採購商的價格、給政府的稅收、店家的利潤以及成本等等。
圖 6-1
所以我們在查詢一筆 BTC 交易的時候, 如果輸入交易號進行查詢, 可能會出現多個地址同時向一個地址發起一筆交易, 也可能會出現一個地址向多個地址同時發起交易。圖 6-1 向我們展示了多個 output 對應一個 input。
7. 關於 Unable to decode output address
我們在使用 blockchain.info 查詢一些交易信息的時候, 會發現如圖7-1這樣的情況, 有些收款地址顯示為 Unable to decode output address, 卻看不到真正的收款地址。那麼這個是怎麼回事呢?
點擊交易號, 進入該筆交易的詳情, 我們可以看到 Output Scripts 裡:`RETURN PUSHDATA(32) [some garbage]` 這個腳本從 `OP_RETURN` 開始, 被稱為空數據輸出, 用於用戶在區塊鏈中存儲任意數據。由於這些輸出數據不同於代幣轉賬, 是不能進行花費的, 所以 scripts 腳本不能對他進行有效評估。但其實這樣的數據輸出大多是伴隨著一個正常轉賬輸出出現的。舉個例子, 這有點像轉賬信息備註, 比如圖7-2, 用戶在做這筆 0.577 個 BTC 轉賬的時候, 就可以將轉賬的一些信息寫入這筆交易 “ Alice send to Bob”. 但是這樣的信息是無法進行消費的, 所以會永遠處於 Unspent 狀態, 並且出現 Unable to decode output address (無法解析輸出地址) 這樣的情況。
結語
8. UTXO 的好處
上邊我們在講到找零地址的時候, 拋出一個問題, 為什麼比特幣在做每筆轉賬的時候, 都要設置新的找零地址。其實這一點, 中本聰在<<比特幣: 一種點對點的電子現金系統>> 裡邊, 在談及隱私 (Privacy) 特性時有提到: “作為額外的預防措施, 使用者可以讓每次交易都生成一個新的地址, 以確保這些交易不被追溯到一個共同的所有者。” [4]
所以說, 比特幣的 UTXO 機制, 更好的保障了比特幣的匿名性。如果我們在查看一個有多筆輸出的錢包地址情況下, 很難確認哪個是找零地址, 哪個是收款地址, 除非我們是當事人。
作者註:
注[1]: input 和 output 是一個相互轉化的關係, 因為你當前錢包的餘額是由 input 得來, 而當你發起轉賬時, 他就變成了 output. 所以說 input 和 output 是一個抽像出來的概念。
注[2]: 在使用 imToken 的時候, 如果你是使用助記詞導入的比特幣錢包, 那麼每次的找零地址, 會是一個新的地址。如果你是 WIF 導入, 既使用明文私鑰導入錢包, 那麼每次轉賬的找零地址, 就是你當前錢包的地址, 不會生成新的接收地址。
注[3]: 這裡所說的多個 input 對應多個 output 可以是1個 input 對應多個 output, 也可以是多個 output 對應 1 個 input或者多個 input 對應 多個 output。
參考文獻:
1. <<Mastering Bitcoin>>
2. https://bitcoin.stackexchange.com/questions/64504/what-does-unable-to-decode-output-address-mean?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa
3. <<比特幣: 一種點對點的電子現金系統>>