文章出于:http://wangxiaoming.com/blog/2016/07/15/e19/
你可以用電腦的中央處理器(CPU)挖以太幣。自從GPU礦工的效率高出兩個數(shù)量級,它就不再盈利了。然而你可以用CPU挖掘在Morden測試網(wǎng)或私有鏈上挖礦,以便創(chuàng)建你測試合約和交易所需要的以太幣, 而無需花費實時網(wǎng)絡上的真實以太幣。
注意:測試網(wǎng)以太幣除了用于測試目的外沒有其他價值(查看測試網(wǎng)絡)。
用geth啟動以太坊節(jié)點時,并不是默認挖掘。在CPU挖掘模式開啟,你會用—mine命令行選項。-minerthreads參數(shù)可以用于設置平行于挖掘線程的數(shù)量(默認為處理器核心的總數(shù))。
geth --mine --minerthreads=4
你也可以在執(zhí)行期間用控制臺開啟或停止CPU挖掘。miner.start取一個礦工線程數(shù)量的可選參數(shù)。
> miner.start(8)
true
> miner.stop()
true
注意挖掘真實以太幣只有在你與網(wǎng)絡同步時才有意義(由于你是在共識區(qū)塊頂部挖礦)。因此以太區(qū)塊鏈下載器/同步器會延遲挖掘直到同步完成,此后挖掘自動開始,除非你用miner.stop()取消挖礦。
為了賺取以太幣,你必須有etherbase(或coinbase)地址集。這個etherbase默認為你的第一個賬戶。如果你沒有etherbase地址,geth –mine就不會開啟。
你可以在命令行重新設置etherbase:
geth --etherbase 1 --mine 2>> geth.log // 1 is index: second account by creation order OR
geth --etherbase '0xa4d8e9cae4d04b093aac82e6cd355b6b963fb7ff' --mine 2>> geth.log
你也可以在控制臺重新設置etherbase:
miner.setEtherbase(eth.accounts[2])
注意你的etherbase不必是本地賬戶地址,只要是現(xiàn)存的就可以。
有一個給你挖掘過的區(qū)塊添加額外數(shù)據(jù)的選項(只有32字節(jié))。按照慣例,它被解釋為統(tǒng)一碼字符串,你可以設置短期虛榮標簽。
miner.setExtra("ΞTHΞSPHΞΞ")
...
debug.printBlock(131805)
BLOCK(be465b020fdbedc4063756f0912b5a89bbb4735bd1d1df84363e05ade0195cb1): Size: 531.00 B TD: 643485290485 {
NoNonce: ee48752c3a0bfe3d85339451a5f3f411c21c8170353e450985e1faab0a9ac4cc
Header:
[
...
Coinbase: a4d8e9cae4d04b093aac82e6cd355b6b963fb7ff
Number: 131805
Extra: ΞTHΞSPHΞΞ
...
}
你可以用miner.hashrate檢查散表率,結果用H/s表示(每秒散表操作)。
> miner.hashrate
712000
成功挖掘一些區(qū)塊以后,你可以檢查etherbase賬戶中的以太幣余額。現(xiàn)在假定你的etherbase是個本地賬戶:
> eth.getBalance(eth.coinbase).toNumber();
'34698870000000'
為了花費你賺的gas來交易,你需要解鎖賬戶。
> personal.unlockAccount(eth.coinbase)
Password
true
你可以在控制臺上用以下代碼片段,檢查哪個區(qū)塊被特殊的礦工(地址)挖掘過:
function minedBlocks(lastn, addr) {
addrs = [];
if (!addr) {
addr = eth.coinbase
}
limit = eth.blockNumber - lastn
for (i = eth.blockNumber; i >= limit; i--) {
if (eth.getBlock(i).miner == addr) {
addrs.push(i)
}
}
return addrs
}
// scans the last 1000 blocks and returns the blocknumbers of blocks mined by your coinbase
// (more precisely blocks the mining reward for which is sent to your coinbase).
minedBlocks(1000, eth.coinbase);
//[352708, 352655, 352559]
請注意,發(fā)現(xiàn)一個區(qū)塊但是不能把它變成典型鏈會經(jīng)常發(fā)生。這意味著你在當?shù)匕淹谶^的區(qū)塊包括在內,當前的狀態(tài)會顯示歸于你賬戶的挖礦獎勵,然而不久后,會發(fā)現(xiàn)更好的鏈,我們轉換到不包含你區(qū)塊的鏈,因而不會記入任何挖礦獎勵。因此很有可能礦工監(jiān)控coinbase余額的時候會發(fā)現(xiàn),它發(fā)生了相當程度的浮動。