前端開發者轉行挖礦的特別技巧
比特幣的熱潮不是沒有來過,只是這一次尤其洶湧。直接催動了區塊鏈技術相關產業的野蠻生長,菜市場的大爺大媽也不再關心韭菜的價格,而是24小時不停歇地死盯著加密貨幣交易市場的起伏,隨時準備貼上自己所剩無幾的棺材本。比特幣漲到了九萬塊的今天,你是繼續選擇做一隻把頭埋在土裡的鴕鳥,每日996,穿著格子襯衫,吃著黃燜雞米飯,拿著10來k的工資;還是拿出你的畢生積蓄,兌換BTC,參與ICO,西裝革履同俊傑名媛談笑風生,坐等幣價翻個幾千倍,從此走上人生巔峰呢?
愛者把比特幣、區塊鏈當作此生的信仰;恨者覺得這不過又是一次披著高科技偽裝的龐氏騙局和洗腦傳銷。但無論如何,身為一名技術從業者,相互切磋切磋,探討探討其背後的原理,也無傷大雅。
相信很多同學對挖礦一直感到好奇,並且躍躍欲試。但早已過了那個一臺 PC 就能挖出幾萬比特幣的時代。一張 1080 動輒上萬還經常缺貨,期貨礦機遙遙無期,普通人想要挖礦成本實在太高,難道就沒有一種低門檻、好上手、易操作、有收益的挖礦手段了嗎?
今天,我就和同學們一起,利用你已掌握的 JavaScript 知識進行挖礦~
P.S.本文所有內容可高調分享,敬請外傳。
什麼是 Coinhive
Coinhive 是一個進行門羅幣挖礦的礦池,它提供了官方的 JavaScript API 等一些列工具,運用其分散式演算法,可以讓你在瀏覽器裡參與雲挖礦。根據你客戶端運算的貢獻度,在平臺扣除了一定的“手續費”之後,會返還給你相應數量的門羅幣作為你的收益獎勵。
什麼是門羅幣
門羅幣(Monero,代號XMR)是一個創建於2014年4月開源加密貨幣,它著重於隱私、分權和可擴充套件性。與自比特幣衍生的許多加密貨幣不同,Monero基於CryptoNote協議,並在區塊鏈模糊化方面有顯著的演算法差異。Monero的模組化程式碼結構得到了比特幣核心維護者之一的Wladimir J. van der Laan的讚賞。Monero在2016年經歷了市值(從5百萬美元至1.85億美元)和交易量的快速增長,這部分是因為它在2016年夏季末期得到了主要的暗網市場AlphaBay的採用。截至2017年,Monero是交易量排行第六的加密貨幣,市值超過3億美元。——Wikipedia
什麼是 CPU 友好型加密貨幣
例如門羅幣採用的工作驗證演算法CryptoNight 為 AES 密集型和很耗記憶體的操作,這顯著降低了 GPU 相對 CPU 的優勢。由此專業礦機或者頂級顯示卡相比較你的個人電腦也就失去了競爭力,通過 CPU 挖礦也就成為了可能,而不會出現贏者通吃的情況。甚至也有一些只能通過 CPU 進行計算的加密貨幣,如果你對此類貨幣感興趣,可以在 CPU COIN LIST 檢視。
如何使用 Coinhive 進行挖礦
Coinhive 的使用非常簡單,你無須明白加密貨幣或區塊鏈的原理,只需要利用你已經掌握的前端知識,分分鐘配好 API 就可以在你的瀏覽器裡進行挖礦了。
利用簡易 UI 進行挖礦
官方提供了一個Coinhive Simple UI Miner ,如果你懶得自己寫程式碼,可以直接將其示例程式碼複製下來,另存為 HTML 檔案,用瀏覽器開啟,就可以進行挖礦了:
<script src="https://authedmine.com/lib/simple-ui.min.js" async></script> <div class="coinhive-miner" style="width: 256px; height: 310px" data-key="YOUR_SITE_KEY"> <em>Loading...</em> </div>
其中的YOUR_SITE_KEY
是你唯一需要注意進行配置的引數,這個設定在你註冊完 Coinhive 的賬號之後,就可以在 Sites & API Keys
頁面裡找到。
你也可以在這裡測試我編寫好的線上示例 進行體驗。
使用 React 編寫一個挖礦應用
也許上述如此簡單的操作不能讓你滿足,那麼你可以嘗試著用官方提供的JavaScript API 自己動手編寫一個挖礦應用。
在這裡,我就試著用最熟悉的 React 編寫了一個簡單的可以實時顯示挖礦進度的應用:
class Miner extends React.Component { constructor(props) { super(props) this.state = { hashesPerSecond: 0, totalHashes: 0, acceptedHashes: 0, } this.handleStart = this.handleStart.bind(this) this.handleStop = this.handleStop.bind(this) } update() { this.setState({ hashesPerSecond: this.miner.getHashesPerSecond(), totalHashes: this.miner.getTotalHashes(), acceptedHashes: this.miner.getTotalHashes(), }) } handleStart() { this.miner.start() } handleStop() { this.miner.stop() } componentDidMount() { this.miner = new CoinHive.Anonymous('zyc1ClPF1ZevATB5gChyGzZklCCZHmY7','react', { throttle: 0.3, threads: Math.floor(navigator.hardwareConcurrency/1) }) this.interval = setInterval(() => this.update(), 1000) } componentWillUnmount() { this.handleStop() clearInterval(this.interval) } render() { return ( <div className="container"> <div className="item"> <h2>Hashes/s</h2> <p>{this.state.hashesPerSecond}</p> </div> <div className="item"> <h2>Total</h2> <p>{this.state.totalHashes}</p> </div> <div className="item"> <h2>Accepted</h2> <p>{this.state.acceptedHashes}</p> </div> <div className="item options"> <button onClick={this.handleStart}>Start</button> <button onClick={this.handleStop}>Stop</button> </div> </div> ) } }
如果你正在學習 React ,上述程式碼也是一個非常好的示例,注意其中事件處理函式繫結this
,以及生命週期函式中設定計時器的用法。
你可以在React Coinhive Miner 檢視除錯線上示例。
使用 Vue 編寫一個挖礦應用
當然肯定還有許多喜歡 Vue 的同學,這裡我也不會偏心,準備了一個使用vue.js
編寫的簡單挖礦應用供同學們參考:
<div id="app"> <p>Hashes/s: </p> <p>Total: </p> <p>Accepted: </p> <button v-on:click="startMining">Start Mining</button> <button v-on:click="stopMining">Stop Mining</button> </div> <script> var app = new Vue({ el: "#app", data: { miner: new CoinHive.Anonymous("zyc1ClPF1ZevATB5gChyGzZklCCZHmY7", "vue", { throttle: 0.3, threads: Math.floor(navigator.hardwareConcurrency / 1) }), statistics: { hashesPerSecond: 0, totalHashes: 0, acceptedHashes: 0 } }, mounted() { this.updateStatistics(); }, methods: { updateStatistics() { setTimeout(() => { this.statistics = { hashesPerSecond: this.miner.getHashesPerSecond(), totalHashes: this.miner.getTotalHashes(), acceptedHashes: this.miner.getAcceptedHashes() }; this.updateStatistics(); }, 1000); }, startMining() { this.miner.start(); }, stopMining() { this.miner.stop(); } } }); </script>
你可以在Vue Coinhive Miner 檢視除錯線上示例。
另外注意到,上述的示例當中,我們都使用到了一個叫做navigator.hardwareConcurrency 的 Web API,通過這個 API 我們能夠獲取到 CPU 的核心數,事實上還有很多其他非常強大有用的 Web API ,感興趣的同學可以自行查閱研究一下。