比特幣出金記

話說很多年前, 我就趕時髦挖比特幣. 後來聽說挖礦的成本 (電費)高於比特幣的價值, 所以就停挖了. 又過了幾年, 聽說雖然比特幣挖不動, 但挖以太幣換比特幣還有賺頭, 所以我又挖了第二次!

當然除了買貴鬆鬆的顯卡, 老婆抱怨經過我房間門口都特別熱 (電費換成喜歡的形式) 之外, 整個電腦都變得不穩. 不但遊戲玩不成, 部落格後台也頻頻當機, 最後只得停工.

最近看到比特幣漲了不少. 於是又開啟 RTX 4090 挖了一下下. 結果本來很穩的電腦, 那個不便宜的 ECC DDR 就這樣燒壞了. 於是我退出江湖, 設法將比特幣出金. 雖然這幾天真的很冷, 挖礦等於開暖氣還賺錢, 還滿懷念的, 哈!

川普當選好像對比特幣有益, 這東西長期應該也是看漲. 不過我只求賺回買顯卡的錢就好了, 所以我算是一面倒地 (又龜速地) 站在賣方. 不幸地, 今年年初起手式就錯了, 我傻傻地從礦場轉帳到自己冷錢包, 這一個動作就被扣了些手續費 0.0001 BTC.

接下來我以為可以找個人交易了, 卻發現場外交易沒那麼簡單. 接著我就做了第二件蠢事, 我把冷錢包的錢轉到幣安, 想說幣安這麼大, 應該很容易賣掉吧! 結果幣安要換美金、甚至換日幣都比較容易, 要找個台幣的賣家根本困難重重. 只好再研究一下那裡好賣? Google 後我找到 Max 交易所.

Max 的認證有點嚴, 我的審查資格搞了好幾天, 比特幣都漲起來了. But, 從幣安轉到 Max, 我又被收一次手續費 0.0000071 BTC. 在心疼手續費之餘, Max 一通過我的身分驗證, 我就市價怒賣比特幣!

成交本身滿快的, 分成兩單被人接走. 然而我想把台幣再轉帳到我的帳戶, 又再被扣了 15 元 NTD 手續費. 在幣安設定帳號時, 它會轉進 1 元新台幣驗證帳戶可用性, 所以算起來我少虧一元. 合計搬家四次後, 手續費總共是 0.0001071 BTC (約 340 新台幣) 和 14 塊新台幣, 合計高達 354 元左右! 股市跌 354 萬都還會漲回來, 這手續費可是一去不回. 總之, 今年總算入袋為安了.

另外, 促使我加速出場的一則新聞是 Google 量子電腦 Willow 的進展. 這個新聞確實讓比特幣跌了一下下 [1]. 其實研究團隊最大的進展在於找到糾錯量子位元 (Error-corrected qubits) 的 pattern, 讓位元數增加時, 糾錯能力可以隨之上升, 把錯誤率壓下來. 因此開啟了更多量子位元的可能.

這讓我好奇究竟量子電腦能否顛覆虛擬貨幣? 稍微研究後發現其實是可以的, 但目前量子電腦都要針對特定用途 (算法) 做設計, 把演算法轉換成疊加態, 才能達到快速計算. 它還不像是個人電腦那樣能夠泛用, 打幾個字就可以寫程式. 所以投資人要評估把剩下的比特幣全部挖完能賺多少, 才知道值不值得為它設計個量子挖礦機? 還是花同樣的力氣去攻略別的標的更划算?

換個角度想, 要是一秒鐘能挖完所有的虛擬貨幣, 那比特幣存在的價值 (公信力) 會剩多少就還不好說? 假設比特幣因此被認為沒有價值, 駭客還不如去破解更保值的東西. 所以這不是送分題. 如果是委內瑞拉要拚一次性挖完比特幣那就還算合理, 因為這本來就是它的法幣 [3], 它說有價值就有價值了, 還不怕別人跟它哄抬挖礦成本.

[REF]

  1. Google Willow量子晶片!即將邁入量子電腦時代!?Google解決什麼關鍵性的問題?
  2. 未來趨勢!一次了解量子電腦將如何掀起運算革命!量子科技原理全解析!
  3. https://0xzx.com/zh-tw/2024090603314843272.html

比特幣搬家小記

話說美股漲得很高, 不知道要投資啥好? 所以想起我挖的比特幣, 是不是該搬出礦場了呢? 雖然不知道搬出來幹嗎? 但是萬一礦場倒了或是被駭客入侵了, 那我不就虧了? 因此詢問 Google 大神後, 決定把錢包搬到手機的某個 APP. 幾年前開挖的時候沒有很認真想, 一口氣裝了好多個 APP, 有些現在不紅, 網路上沒人推薦了. 那些能夠長青的 APP 還滿厲害的.

從 NiceHash 搬出來時, 它扣了我一點手續費 (0.0001 BTC ~= 4.25 USD). 好消息是 24 小時內果然就入帳了, 取款相當順利. 倒是在手機登入時很搞笑! 要兩階段認證!? 蛤? 我完全不記得是那個 auth 軟體, 想半天也試半天才找出它的身影. 就這樣安然過了一段時間, 原本以為這樣就搞定了.

萬般無奈想不到, 昨天我的手機電池忽然不行了. 到 25% 左右就直接歸零關機, 我只好再幫比特幣搬一次家. 首先當然是在第二台手機上裝 APP, then…我就不會了. Google 了一下說是有 private key 或是當初的種子就能直接轉移.

不過手機 APP 這邊要先決定好是哪一種錢包, 才能走上面的流程. 例如標準錢包, 兩階端認證錢包 (wallet with 2FA), 多人授權錢包 (multi-signature wallet)…等等. 從上面的經驗, 當然是選兩階段認證錢包對吧! 不過它還有一個 import private key 的功能, 這讓我誤以為可以直接 import private key [1] 或是輸入種子就好. 結果這條路走不通. 只好先去吃早餐.

有個霸氣的方法, 只要再開新個錢包,自己轉給自己總行了吧!理論上是可以, 不過這樣還會被 APP 收手續費, 感覺是耍白癡送錢給人家! 直到吃完晚餐後, 多少變聰明一點點, 乖乖回去選兩階段認證錢包, 然後選我已經有種子了, 再把珍藏的 12 個英文單字輸進去, 錢包就轉過來了. 當然這個過程還要做一次兩階段輸入的驗證. 安全性還滿高的.

非當事 seeds

最後 APP 有個選項看起來是指可以讓兩個錢包並存, 所以我兩隻手機上都有比特幣了. 當然地址是一樣的, 錢沒有多一倍! 題外話是上次轉帳完有點不甘心, 所以想叫 GTX4090 幫我把手續費挖回來, 結果半天只挖到 0.5 USD, 算起來要挖一週多才可以拿到 4.5 USD, 而且未必能賺回電費. 想想還是算了. 挖礦的黃金歲月已經過了.

[REF]

  1. https://pascal-bergeron.com/en/posts/export-private-keys-electrum/

區塊鍊小註解

最近比特幣 (bitcoin) 又紅了起來, 算算從我上次停止挖礦已經有三年多的時間了. 在這期間比特幣大幅升值, 不過挖礦的難度也上升了! 雖然我的比特幣錢包還能用, 挖礦軟體也還能挖, 但自己挖礦仍然不划算. 雲端挖礦又有龐式騙局, 真是沒意思啊!

除了比特幣本身, 其實我也更想了解區塊鍊 (block chain) 的原理. 坊間有很多講區塊鍊的書, 通常都是講區塊鍊有多偉大多偉大. 不過為何能夠做到去中間化、分散、公信力…這個就很少人討論了. 好比賣藥的都說人蔘是藥王, 但是人蔘皂苷為何能達到那個效果? 舌燦蓮花的導遊可說不上來. 為了明辨那些東西是可以做得到的, 我們還是回頭複習比特幣.

網路上有許多介紹比特幣的文章, 讀完 [1][2] 兩篇就會大概有個了解. 首先一個 block 的大小是 1MB, 這個格式以內用盡了之後, 就沒有新 bitcoin 了. 這是當初人們認為 bitcoin 不會有通貨膨脹的原因. 但人們總是不滿足的, 前幾天 (August 1st 2017, at 12:20pm UT) 硬是分裂了. 原本有一個比特幣 (bitcoin, BTC) 的人會得到一個比特幣 (BTC) 和一個比特幣現金 (BCC, bitcoin cash), 日後才挖的人就一分為二 [3].

礦場現在會問你要照舊? 隨便礦主處置? 還是挖新礦 (根據 NYA = the New York Agreement, hard fork) ?  但根據報導, 80% 的礦工都同意了 NYA [4]. 沒得挖全世界不就都沒搞頭了? 當然挖啊! 我看下一次的 split 也不會太遠了.

再回頭說第一個 block, 它應該是中本聰挖 (規定) 的吧! 也就是所謂的 genesis block [6]. 長相如下:

GetHash() = 0x000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f
hashMerkleRoot = 0x4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b
txNew.vin[0].scriptSig = 486604799 4 0x736B6E616220726F662074756F6C69616220646E6F63657320666F206B6E697262206E6F20726F6C6C65636E61684320393030322F6E614A2F33302073656D695420656854
txNew.vout[0].nValue = 5000000000
txNew.vout[0].scriptPubKey = 0x5F1DF16B2B704C8A578D0BBAF74D385CDE12C11EE50455F3C438EF4C3FBCF649B6DE611FEAE06279A60939E028A8D65C10B73071A6F16719274855FEB0FD8A6704 OP_CHECKSIG
block.nVersion = 1
block.nTime = 1231006505
block.nBits = 0x1d00ffff
block.nNonce = 2083236893

CBlock(hash=000000000019d6, ver=1, hashPrevBlock=00000000000000, hashMerkleRoot=4a5e1e, nTime=1231006505, nBits=1d00ffff, nNonce=2083236893, vtx=1)
CTransaction(hash=4a5e1e, ver=1, vin.size=1, vout.size=1, nLockTime=0)
CTxIn(COutPoint(000000, -1), coinbase 04ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73)
CTxOut(nValue=50.00000000, scriptPubKey=0x5F1DF16B2B704C8A578D0B)
vMerkleTree: 4a5e1e

通用的格式如下所示:

Block structure [7]

Field Description Size (Bytes) Updated when…
Magic no value always 0xD9B4BEF9 4
Blocksize number of bytes following up to end of block 4
Blockheader consists of 6 items 80  由以下六項組成
– Version Block version number 4 You upgrade the software and it specifies a new version
– hashPrevBlock 256-bit hash of the previous block header 32 A new block comes in
– hashMerkleRoot 256-bit hash based on all of the transactions in the block 32 A transaction is accepted
– Time Current timestamp as seconds since 1970-01-01T00:00 UTC 4 Every few seconds
– Bits Current target in compact format 4 The difficulty is adjusted
– Nonce 32-bit number (starts at 0) 4 A hash is tried (increments)
Transaction counter positive integer VI = VarInt 1 – 9
transactions the (non empty) list of transactions <Transaction counter>-many transactions

每一個 block 都得包含前一個 block header 的 hash 值, 日後每一個新的 block 加入 block chain 之後,  都會定時更新所有的 block 的紀錄 – 也就是上表的 “updated when", 保證大家的資訊都一致. 時間戳記則保障一個 block 不會分岔出兩個分支 – 相當於造假或是一個 bitcoin 賣給兩個人. 細節在大部分的網路文章裡面都有, 就暫且不提.

看 proof-of-work [10] 的流程 [13] (如下圖). 我們先假設一個 block 就是答案, 然後加上前一個 block 的 header 和一個遞增的 nonce 去做 hash, 如果做出來的 hash > target value 才會被接受.

block-chains

圖的右半部最簡單, 每個 block 都有一個 nonce, 就像 genesis block 的 nonce  = 2083236893, 後續的 block 的 nonce 會愈來愈大.

圖左半部在講難度 (difficulty) [9], 它也就是 block 格式中的 4 Bytes “Bits". Difficulty 就是要讓挖礦愈來愈難, 這倒不是故意要為難挖礦的人, 而是讓造假的人得付出非常大的代價造出一個完整的 block chain.

系統每 2016 block 就會調整一次難度, 目標是每 10 分鐘生出一個 block, 若兩個星期沒有產出 2016 個 block, 難度就會降低. 根據速算公式[9]: 產生 1 個 block 的時間 = D(Difficult) * 232 / 600. D = 1, 7M Hash/s 可以產生一個 block.

圖的中間線是重點. 根據中本聰的原文, 他是參考 Adam Back 的 HashCash [11], 如下圖. 由於 bitcoin 用 SHA-256 從 bit string x 產生 256 bits 的 HASH, 下面公式中的 k 就是 256. MINT() 是 cost-function, VALUE() 是 evaluation function, 只是確認 T (token) 符合所需.

hashcash

我的認知是: 用 s 和 x 兩個 bit string 兜成 s||x, 這個 string 經過 SHA-256 之後, 它的前 (左) w bit 若都是 0, 就符合所需 cost function 所需. 很多文章都在講前置 0 愈多愈複雜, 這就是原因了. 因為產生的 HASH 還特別指定長相 (0 的個數), 使得 x 的候選人變得更少. 這群有部分同樣 hash 結果的 bit strings 屬於 partial hash collisions.

Ref [6] 說到: “The hashcash cost-function is based on finding partial hash collisions on the all 0 bits k -bit string 0k. The fastest algorithm for computing partial collisions is brute force." 換言之, 就是只能用暴力法把可能空間裡面的會產生 partial hash collision 的值都找出來.  

Ref [8] 說到, Honest generators only build onto a block (by referencing it in blocks they create) if it is the latest block in the longest valid chain. “Length" is calculated as total combined difficulty of that chain, not number of blocks, though this distinction is only important in the context of a few potential attacks. A chain is valid if all of the blocks and transactions within it are valid, and only if it starts with the genesis block.

新的 block 必須是從 genesis block 算起來, 能做出最長的 length (最大難度) 的那條路徑上的 block. 下圖 (取自 [8]) 綠色 block 是創世紀區塊 (genesis block), 黑色的 block 是 main chain. 紫色 block 雖然合乎規範, 但是不能用. 那些沒有用的 block 會變成孤兒, 價值為 0.

proof-of-work-figure

那怎麼保證我的 block 在 main chain 上呢? 根據 partial collision 的原理, 很有可能大家都發現不同的解答, 然後拼命往下衝! 那如果衝錯不就 GG 了? 根據 [2], 的確很有可能會做虛工! “從第一個區塊到各分支末端中所有區塊難度總和最高的分支稱為主分支,通常也是分支長度最長的。區塊要再經過100 次挖到礦後才被認為成熟,只有主分支上的成熟區塊才能獲得獎勵。"

根據以上的資訊, 雖然沒有 100% 的把握都是正確的. 但我大概可以推論, 大家都只看到區塊鍊建立好之後的優點, 卻忽略了區塊鍊建置的成本. 比特幣的成功建立在大家想賺錢的需求之上, 若任何企業想要建立區塊鍊, 卻不投資成本是不可能的. 先不說挖礦的過程可能會做虛功, 造成多餘的碳排放量. 依照 proof-of-work 的原理, 只要不誠實的 block 比誠實的更多, 整個結果就可以被改寫了. 這個風險真的超大, 歹徒可以弄個幾萬台殭屍電腦一起來投票, 並且把正主的網路切斷 10 分零一秒, 網路上大家都說錢是我的, 等你上線之後, 少數還得服從多數呢! 這個風險在比特幣不成立, 因為 client 眾多, 但新成立的區塊鍊簡直就是很好破啊~~

[REF]

  1. 比特幣 (Bit Coin) 到底是什麼?運作原理大揭密
  2. 道高一尺 魔高一丈:比特幣是怎麼回事?
  3. Before and After — the Great Bitcoin Fork
  4. Bitcoin Miners Are Signaling Support for the New York Agreement: Here’s What that Means
  5. SHA-2
  6. https://en.bitcoin.it/wiki/Genesis_block
  7. https://en.bitcoin.it/wiki/Block
  8. https://en.bitcoin.it/wiki/Block_chain
  9. https://en.bitcoin.it/wiki/Difficulty
  10. https://bitcoin.org/bitcoin.pdf
  11. http://www.hashcash.org/papers/hashcash.pdf
  12. https://blockchain.info/blocks/1231538600001
  13. https://www.bitcoinmining.com/what-is-proof-of-work/

比特幣火速挖礦指南

比特幣最近滿流行的,聽說中國的大媽都在挖礦,我就來快速跟大家講一下如何挖吧!

首先需要一個比特幣錢包, 還沒有挖礦, 也沒有買賣, 要錢包做什麼? 主要是為了取得自己的地址, 打開錢包的收受方就會看到地址了. 他長得像一個 1 開頭的 32 bit 的十六進位的值, 不過除了阿拉伯數字還有英文的大小寫.

光是錢包就有很多選擇, 我安裝了號稱比較慢的 BitCoin-QT [6], 真的很慢~~~, 落後 75 個星期是什麼概念? 看來這東西不能用, 只要獲取地址就好.

其次需要一個挖礦機, 理論上什麼軟硬體都能挖礦. 新聞還報出了世芯電子出的挖礦機, 總之專屬的硬體一定是比一般的電腦好, GPU 又比 CPU 好.據說 Nvidia 的 CUDA 有比較好的加速, 

有了挖礦機之後還要去找礦池.

有沒有一次搞定的方法呢? 網站上 [1] 推薦使用 GUIMiner [2].顧名思義, 它是有 GUI 的挖礦機, 上面有個 server list (服務器), 從這裡就可以選要去哪個礦池 (server) 挖礦, 不同的 server 有不同的抽成規則, 總之, 為了好玩的話, 可以選一個抽成比較少的 [3][4].

選好 server 之後, 當然要去註冊啊!於是我就點了右邊的網站 http://mining.bitcoin.cz, 註冊需要定一個帳號和密碼, 還要用一個有效的 email address 去 active 這個帳號. 此時, 網站就會給您另外一個帳號和密碼, 這個是挖礦專用的, 要填在用戶名和密碼哪兩欄. 因為軟體已經偵測到我的顯卡 – CUDA 核心比 GTX760 多兩個的 GTX660 TI, 所以大致上就算 OK 了?

不! 我本來很開心地去點 “開始採礦", 想知道會發生什麼事? 結果底下跑出一行 bug 訊息: “ValueError: need more than 1 value to unpack”, 原來是我少了一個參數! 哪一個呢?原來我要在礦池登錄我的地址. 用申請帳號的那個 username 和 password 登入之後, 要在 My Account 的下面輸入 BitCoin Address! 剛剛從錢包裡抄來的地址, 在此正式派上用場! 附帶一提, 錢包裡的地址不用真的去抄寫, 它可以用 copy 的, 不然可累死了.

好了! 這次我真的可以採礦了! 軟體右下角的 “已停止" 會變成 “XX Mhash/s", 也就是每秒做多少 M  個 HASH. 我的顯卡跑起來大概是 98 個 M.

不過身為搞了好幾年演算法的人,怎麼能和大陸大媽做一樣的事呢? 當然是要研究一下採礦軟體怎麼寫? 以及開一個礦池來抽別人的成囉! 哈! 這個 BFGMiner 的網站 [5] 就是有提供 open source 的.只不過有 source code 的部分僅限於 OpenCL 的 CL 檔.

另外, 大家應該會想知道挖礦能不能回本吧, 網路上也有計算機 [7] 可以算. 重要的因素有三個, 一個是現在採礦的難度有多高, 這個 Difficulty Factor 會一直上升. 第二就是採礦的能力有多大, 我就填了我剛剛測到的 98MH/s. 然後就是匯率, 以現在的匯率來說,採一天是 0.08 美元, 也就是 2.4 元台幣左右. 換言之, 不是專業的採礦機是很難賺回電費的!

[REF]

1. 比特幣挖礦詳細圖文教程 

2. http://guiminer.org/

3. [Bitcoin礦池] 礦池Pool簡介 (中文)

4. Comparison of mining pools (英文)

5. http://bfgminer.org/

6. 下載 BitCoin-QT 錢包 Download Bitcoin-Qt

7. Bitcoin Mining Calculator