2018-06-15

從 ASIC 礦機看數位貨幣的安全性

隨著以太幣、比特幣的價格上漲,在炒作的同時,也有許多人加入礦工的行列

而如果有去了解數位挖礦,就會知道有分成用顯示卡挖礦跟用礦機挖礦,而礦機一直是一個很有爭議的東西,而其中又以佔有最大市占率的比特大陸(Bitmain)最有爭議性

顯示卡挖礦就不說,先來解釋一下所謂的礦機,其通常是以 ASIC 晶片為架構,而早期則是以 FPGA 晶片為主
  • 殊應用積體電路(Application-specific integrated circuit,ASIC)
  • 現場可程式化邏輯閘陣列(Field Programmable Gate Array,FPGA)

早期多半是使用 FPGA 晶片,把演算法電路設計好後再燒錄進去晶片裡面,所以多半是從硬體開發板修改而來,後期才出現一張電路板上安裝多顆 FPGA 晶片的訂製礦機



像是 Earthsoft PV4 這張日本製色差擷取卡就是以 FPGA 晶片作為演算核心

以 Spartan-3 XC3S200 FPGA 晶片為核心的硬體開發板當作礦機

之後也出現這種使用雙實體 FPGA 晶片的開發板礦機

後期則是出現了這種訂製的,堆疊大量 FPGA 晶片的礦機

然而 FPGA 跟人類一樣,終究有其極限的,FPGA 的優點是它的電路都可以重新燒錄跟抹除,但如果開發用途不變時,那沒用到電路就是累贅了,如果挖比特幣只需要 SHA-256 的加密演算,那其他功能的電路就是佔據空間的累贅,如果要在單位面積內堆疊更多的演算力,那就會演變到 ASIC 晶片


南瓜博士設計的 Avalon 算是最早的 ASIC 礦機

初次接觸比特幣等數位貨幣大概是 2013 年中旬,那時候都是以開發板衍生的 FPGA 礦機為主,比特大陸剛剛成立,南瓜博士的阿瓦隆(Avalon)剛設計完成在作原型機測試,比特幣的價格是美金一百五十,折合約新台幣四千六百

那時一台 ASIC 礦機都要台幣十萬,要購買還有很大的麻煩(多半是跨國貨運跟付款的問題),重點是大家都不確定比特幣會不會改演算法,如果改了,那所有以 SHA-256 演算為特化的礦機會直接變成廢鐵

但最後比特幣並沒有改變演算法,它分歧出去的分叉幣也多半是沿用這個演算法

當初賭了一把買礦機的人也多半暴富,也開啟了 ASIC 礦機壟斷算力的不歸路



比特大陸的螞蟻礦機 T9,ASIC 礦機

有些人會不懂為什麼礦機會這麼討人厭,甚至會理解成一種仇富心態,但這其實是不正確的

礦機,尤其是ASIC 礦機造成的最大問題,是算力的集中化,這與數位貨幣的開放、公平理念違背,而更大的問題是安全性

數位貨幣的區塊驗證制度,以比特幣來說是要持有接近過半的演算力,因此有所謂的 51% 攻擊,只要有過半的演算力是由惡意攻擊者持有,他就可以竄改挖出來的新區塊(因為數位貨幣不可逆的特性,他沒辦法竄改已經挖出來的區塊,但可以竄改新區塊)

下面用五個節點來示範數位貨幣的驗證制度,當然現實中的節點不會這麼少,但如果你把礦池當作是一個單一節點的話也可以這樣解釋



正常情況下每個演算節點都是個別持有,且承認新挖出來的區塊

如果兩個演算節點被同一個惡意攻擊者持有,即使他竄改來搶先挖出新區塊,也會因為沒過半被駁回

但如果他持有過半的演算節點,那他就可以達成所謂的 51% 攻擊

由於 ASIC 礦機在單位成本上與 GPU/CPU 挖礦相比,佔有壓倒性的優勢,因此較少數量(比較之下)的 ASIC 礦機就可能達成 51% 攻擊,考慮到大部分的礦機都是比特大陸的螞蟻礦機系列,且大部分算力都是在比特大陸的螞蟻礦池之下,這又在安全性上造成了更多疑慮

  • 如果大部分 ASIC 礦機都是同一家公司製造,然後管理軟體有同樣的安全性漏洞或是後門可以劫持?
  • 如果大部分 ASIC 礦機都是同一家公司製造且在同一個礦池之下,然後礦池的控制權被劫持?

在這兩個假設下,你就會發現 ASIC 礦機是一個很危險的東西

也因此,開發社群抵抗的從來就不是誰、或哪家公司因為賣出大量的挖礦設備而大賺硬體財,而是抵抗算力的集中化,要讓算力分散化,最簡單的方式就是盡量讓大家都可以用手上都會有的硬體挖,不論顯示卡、處理器或是智慧型手機,乃至於硬體開發板

而在同樣的資本投入下,建立 GPU/CPU 礦場與建立 ASIC 礦場一比,後者的壓倒性算力優勢造成了很大的不公平,也產生了上述的安全性問題

目前採用 PoW 機制(Proof of Work,工作證明機制)的數位貨幣如果沒有發展出抗 ASIC 演算法,則多半有這個問題,除非改成 PoS 機制(Proof-of-Stake,權益證明機制),來透過價格跟持有量壓制達成 51% 攻擊的難度

2018-06-05

Sony WI-1000X 簡易開箱

用了差不多兩年半的 Sony SBH70 遇到了電池衰減的問題,感覺續航力降低了許多,開始物色新的藍芽耳機

這次把預算放寬許多,拉到萬元線,選擇了有主動式降噪、支援 AAC 跟 aptX 編碼格式的 Sony WI-1000X


2016_02_28_205554
使用了兩年多的 Sony SBH70
2018_06_05_214926
新購買的 Sony WI-1000X,包裝正面
2018_06_04_210442
包裝背面,詳細講述了規格與注意事項
2018_06_05_214958
從包裝裡可以退出一個黑色盒子
2018_06_05_215052
打開就是固定在高密度泡綿的耳機本體,這是事後重拍的,已經把保固序號貼紙移除
2018_06_05_215216
黑色布質收納袋、說明書、充電用的 Micro USB 傳輸線,民航機的雙插孔轉換頭、耳機轉 Micro USB 傳輸線、耳機套
2018_06_05_215246
Sony 原廠提供了六對不同的耳機套,讓使用者依照耳道形狀更換
2018_06_05_215252
充電用的 Micro USB 傳輸線,民航機的雙插孔轉換頭、耳機轉 Micro USB 傳輸線
2018_06_05_215226
黑色布質收納袋
2018_06_05_215422
右側紅色標示,馬來西亞製造說明、五伏特直流電驅動、電檢與藍芽標示
2018_06_05_215414
右側前端的按鈕,用於切換、開始或關閉降噪模式
2018_06_05_215436
電源指示燈、電源開關、音量按鈕、播放、暫停與接聽按鈕
2018_06_05_215734
充電與耳機接入用的 Micro USB 傳輸埠在蓋子下

Sony WI-1000X 的 Micro USB 傳輸埠有點微妙,只支援充電跟音訊傳輸(需要透過專用的 3.5mm 轉 Micro USB),也就是說更新韌體這種功能要靠跟耳機搭配的工具軟體,透過藍芽傳輸新版韌體,過程大概是三十分鐘至五十分鐘不等(視使用的手機而定

2018_06_05_215746
專用的 3.5mm 轉 Micro USB 傳輸線

插上耳機,連接電腦後,就是一般的耳機而已,可以自己選擇要不要開啟電原來使用降噪

Sony WI-1000X 本身支援多種傳輸編碼格式,從基本的 SBC 到 AAC 跟 aptX 編碼格式

而如何在 macOS 上驗證不同的編碼格式需要從蘋果的開發者專區下載 Bluetooth Explorer 去作調整,從 Apple Developer 下載的工具整合壓縮包裡面找到 Bluetooth Explorer 然後放進應用程式資料夾就可以了





將連線連線至 Mac 而沒有啟用音訊傳輸時,按下 option 去檢視進階資訊會顯示未啟用

把 Bluetooth Explorer 扔進應用程式資料夾後啟用

選擇 Audio Options

就可以調整系統預設的傳輸編碼,當然最終還是要依你使用的耳機支援性而定

啟用 Sony WI-1000X 的 AAC 編碼格式傳輸,其實 macOS 對支援 AAC 的藍芽耳機預設應該都是有開啟 AAC 的支援性

當然你高興也可以調整成 aptX 編碼格式

要說總結的話,耳道式的降噪耳機好像也沒幾家可以挑,但 Sony WI-1000X 的音質確實是很不錯,支援 AAC 格式也讓 macOS 跟 iOS 裝置不會再屈就於傳統的 SBC 有損壓縮編碼

唯一的小遺憾,就是這耳機不防水(是的,這耳機真的不防水,戴著運動流汗可能沒差,但千萬不要賭說下雨不會怎樣

點我前往 Sony 官網檢視 WI-1000X 的詳細資訊

2018-05-20

APC Back-UPS 650 BN650M1-TW 不斷電系統

夏日炎炎,有了去年 815 全臺大停電的經驗,大家都開賭盤今年盛夏只要哪個發電廠突發性跳機或是誰又手賤關了不該關的,全台灣立刻就會跟內湖一樣黑漆漆

不只電腦很怕斷電,其實樹莓派這類以 MicroSD 為儲存裝置的開發板也很怕斷電,尤其是寫入資料的時候如果不幸斷電,那就跟固態硬碟一樣很容易倒置記憶卡受損或資料遺失,如果開發環境跟資料都累積不少了,那可真是會欲哭無淚

從以前到現在,中華電信的家用網路一直都有個特色(應該說有作備援的電信業者都應該是如此),就是如果局端(機房端)還有電力,然後到你家這段距離的電信箱、光化箱的電池也足以支撐,然後你家的數據機有電,那停電時你其實還是有網路的,不論 vDSL 或 FTTH

於是這樣那樣,決定幫家裡的網通產品找個不斷電系統,剛好大廠 APC 推出了一款給辦公桌或網路產品等中度負載以下使用的,台灣地區的型號是 APC Back-UPS 650 BN650M1-TW

那就決定是你了,至於開箱跟硬體分析的部分可以參考港都狼窩 狼大的開箱文


2018_05_03_234412
大家的好朋友 PChome
2018_05_03_185944
APC 的電池是倒置在電池室裡面,拿出來裝回去就好
2018_05_03_234406
包裝裡面有出廠前的檢測報告

要插上插座開始使用前,大家都有一定機率產生一個問題,那就是

為什麼配電異常指示燈是亮的?

不要恐慌,這個是很正常的,如果你家的插座跟配電規範是比較早期的,那就沒有接地線的配置,你可以用驗電筆檢查一下你插座的火線是不是真正的火線,如果是的話那就沒差,但如果不是建議調整一下插座

另外,經過測試,用中性線、接地線短接法是可以讓配電異常指示燈熄滅的,因為這樣讓中性線跟接地線處在同一個大地電位上(依法電錶跟配電盤是要讓接地線跟用中性線短接),雖然這樣是吃步的假性接地,但用在沒有接地線的老公寓是可行的


2018_05_20_174412
總之就是安裝進網通產品下方
2018_05_20_174420
通往數據機、樹莓派的電源跟 UPS 數據線

大概就是這樣了

2018-03-20

如何幫 ProfitTrailer 自動交易機器人安裝 SSL 憑證並啟用加密通訊

ProfitTrailer 是一款用於進行加密貨幣買賣的自動交易機器人,也就是俗稱的 BOT

由於採用了 node.js 的架構,因此 ProfitTrailer 可以在 Windows、MacOS 和 Linux 等系統上運作,應該說只要是支援 node.js 套件的系統都可以運行,而且它可以透過網路瀏覽器來作 GUI 層面的操作,降低在終端機上誤操作的機率

由於你要運作 ProfitTrailer 就需要讓電腦不關機,除了把它裝在迷你電腦或是樹莓派等開發板上,把它安裝在網路上的虛擬主機也是可以的,而且相較於運作在開發板上,效能瓶頸比較沒那麼嚴重,我也是選擇把 ProfitTrailer 安裝在 Google Cloud Platform 上的執行單元

而如何在 Google Cloud Platform 上安裝 ProfitTrailer?可以參考這篇文章,我就不贅述了



運行在 Google Cloud Platform 上的 ProfitTrailer,可以透過網頁操作

但如果運行在 Google Cloud Platform 之類的主機上,然後透過網路去存取,則會碰到資安上的問題,雖然透過 ProfitTrailer 或是交易所的 API 是無法進行轉帳與領現的,但如果你的 ProfitTrailer 有開啟 HotConfig 可以透過網頁修改策略檔案,被入侵的話也是會有所損失,比如惡意調整你的策略讓你虧損,或是直接幫你按下停機鈕把 ProfitTrailer 關閉

而 ProfitTrailer 有提供 SSL 加密通訊的功能,可以將網路介面的部分加密,這篇文章就是教你如何去幫 ProfitTrailer 綁定 HTTPS 通訊

首先,請買一個網域,然後把 DNS 指向 CloudFlare,這很重要

透過 CloudFlare 的 CDN 與防護,可以把運作 ProfitTrailer 主機的真實 IP 位址隱藏在 CDN 後方,當然用誤試法去掃描全網路的 IP 總有一天會碰到,但如果單純用 WHOIS Lookup 跟查閱網域資料,是可以隱藏起來,避免大部分的好事之徒

當然,也是方便我們去簽署 SSL 憑證



在 CloudFlare 的後台把網域填入之後,要到你購買網域的地方把 DNS 指定為 CloudFlare 的 DNS

要幫 ProfitTrailer 加上 SSL 加密通訊有點複雜,如果照著 ProfitTrailer Wiki - Setup SSL 去弄有很高的機率會搞砸,畢竟不是人人都會在終端機上面安裝 Let's Encrypt 的自動 SSL 憑證簽署模組,此外還有一個問題點

ProfitTrailer 使用的網路介面是基於 Apache Tomcat,簡單說就是建立在極度簡化的前提下,給 Java 程式使用的 HTTP daemon,這也是為何 ProfitTrailer 只支援 PKCS12 這種整合性的金鑰檔,所以在安裝 Let's Encrypt 的模組後,當你好不容易搞定而且生成的 PEM 格式的金鑰檔,還要再把 PEM 格式的金鑰轉換成 PKCS12 加密的 P12 金鑰檔,然後去 ProfitTrailer 的設定檔調整參數才可以

所以我們用簡單點又粗暴的方法來完成簽署 SSL 憑證,透過 SSL For Free 這個網站,就可以直接申請 Let's Encryp 的 SSL 憑證,之後生成加密 P12 金鑰檔步驟就可以更簡單的完成



前往 SSL For Free 去簽署 SSL 憑證,把你要給 ProfitTrailer 使用的網域填入

由於 ProfitTrailer 沒辦法去修改網頁端輸出,因此透過最右邊的 Manual Verification (DNS) 去完成

由於 DNS 支援 TXT Records 這種操作,因此可以用這種方法認證網域的所有權

按下 Manual Verify Domaon 後,你會看到這個畫面,注意那兩個驗證位址

這時請打開你的 CloudFlare CDN 控制台,前往你的網域,在 DNS 這個項目下,選擇 TXT 這個類型,在 Name 與 Value 那邊依序填入 SSL For Free 要求的網域名稱跟字串,TTL 設定成預設值的自動就好,再按 Add Record

沒意外的話,完成操作後,當你點擊 SSL For Free 產生的網址時,就會看到相應的字串紀錄



先在 Name 填入 _acme-challenge

然後在 TXT content 填入相應的亂數字串

應該要像是這樣

回到 SSL For Free,點擊 Download SSL Certificate,你會看到這個畫面,這是在驗證中

沒意外的話,就會看到這個畫面,屬於那個網域的 Certificate、Private Key 與 CA Bundle 都會出現

由於安全性的關係,上面的圖都把字串的部分遮蔽

看到 Certificate、Private Key 與 CA Bundle 生成後,你可以點選 Download SSL Certificate Files,或是開啟你熟悉的編輯器,然後分別存成三個 PEM 格式的金鑰檔案

然後,請妥善保管你的金鑰檔案,特別是 Private Key,因為有了 Private Key 就可以製作網站 SSL 憑證

接著請開啟 FTP 軟體,把這三個金鑰檔案丟到虛擬主機上



我在使用者的個人目錄裡面創建了一個 ssl 資料夾,專門存放這些檔案

接下來請開啟你的終端機,先切到 root 權限,Google Cloud Platform 的話就是輸入 sudo su,接下來請使用 cd 指令切換到你剛剛上傳金鑰檔案的資料夾,然後輸入這個指令

把 Certificates.crt 換成你儲存 Certificate 的檔案名稱,Private.key 替換成你儲存 Private Key 的檔案名稱,CA.crt 儲存 CA Bundle 的檔案名稱,其餘指令都是照舊

接著會要你輸入一個密碼,如果很懶、而且你的 ProfitTrailer 登入密碼是長度超過二十字元的強密碼,那也是可以用一樣的密碼

沒意外的話,這個指令就會生成一個名稱為 PKCS12.p12 的金鑰檔,記下那個檔案的位置,沒亂跑的話,它會乖乖待在那個你剛剛上傳的資料夾,然後再用 cd 指令切換到你安裝 ProfitTrailer 的資料夾,編輯 application.properties 這個系統參數檔(我是用 Vim 這個編輯器),加入這些參數在 server.port 後面,當然 server.port 也要調整,建議調成 443

/home/user/download_ssl/PKCS12.p12 替換成你存放 crt.p12 的目錄位置(要包含 crt.p12 檔案),p12password 替換成生成 P12 金鑰檔時填寫的密碼

然後存檔離開

沒意外的話,重開 ProfitTrailer 然後等一會,你應該就可以正常訪問 ProfitTrailer 的登入畫面了

在 CloudFlare CDN 控制台,前往你的網域,在 Crypto 這個項目下,把 SSL 的等級調整成 Full 或是 Full (strict),並開啟 Always use HTTPS,則 CloudFlare 會驗證你的 P12 金鑰檔是否正確,如果有異常的話,通常會出現 Error 525 SSL handshake failed 來提醒你 P12 金鑰檔可能過期或是你簽爛了



重開 ProfitTrailer 然後等一會,你應該就可以透過 HTTPS 正常訪問 ProfitTrailer 的登入畫面

最後注意一點,Let's Encrypt 的 SSL 憑證預設期限是九十天,而 SSL For Free 會在 SSL 憑證過期前兩週發信提醒你要更新,就照前面的程序,去 SSL For Free 更新 DNS TXT Records 後拿取更新的 SSL 憑證,然後一樣透過那個 openssl 指令生成新的 P12 金鑰檔去替換掉舊的金鑰檔就好

如果你覺得這篇有所幫助,也可以給我一點贊助

Bitcoin | 1FcBQGbpgHjkh7C3zK8asQyMauK5Lm3Dh2
Ethereum | 0x6071cc4ca777862b934046acae5e840d1944a60d