文章出于:http://wangxiaoming.com/blog/2016/07/15/e19/
你可以用電腦的中央處理器(CPU)挖以太幣。自從GPU礦工的效率高出兩個數(shù)量級,它就不再盈利了。然而你可以用CPU挖掘在Morden測試網(wǎng)或私有鏈上挖礦,以便創(chuàng)建你測試合約和交易所需要的以太幣, 而無需花費(fèi)實(shí)時網(wǎng)絡(luò)上的真實(shí)以太幣。
注意:測試網(wǎng)以太幣除了用于測試目的外沒有其他價值(查看測試網(wǎng)絡(luò))。
用geth啟動以太坊節(jié)點(diǎn)時,并不是默認(rèn)挖掘。在CPU挖掘模式開啟,你會用—mine命令行選項(xiàng)。-minerthreads參數(shù)可以用于設(shè)置平行于挖掘線程的數(shù)量(默認(rèn)為處理器核心的總數(shù))。
geth --mine --minerthreads=4
你也可以在執(zhí)行期間用控制臺開啟或停止CPU挖掘。miner.start取一個礦工線程數(shù)量的可選參數(shù)。
> miner.start(8)
true
> miner.stop()
true
注意挖掘真實(shí)以太幣只有在你與網(wǎng)絡(luò)同步時才有意義(由于你是在共識區(qū)塊頂部挖礦)。因此以太區(qū)塊鏈下載器/同步器會延遲挖掘直到同步完成,此后挖掘自動開始,除非你用miner.stop()取消挖礦。
為了賺取以太幣,你必須有etherbase(或coinbase)地址集。這個etherbase默認(rèn)為你的第一個賬戶。如果你沒有etherbase地址,geth –mine就不會開啟。
你可以在命令行重新設(shè)置etherbase:
geth --etherbase 1 --mine 2>> geth.log // 1 is index: second account by creation order OR
geth --etherbase '0xa4d8e9cae4d04b093aac82e6cd355b6b963fb7ff' --mine 2>> geth.log
你也可以在控制臺重新設(shè)置etherbase:
miner.setEtherbase(eth.accounts[2])
注意你的etherbase不必是本地賬戶地址,只要是現(xiàn)存的就可以。
有一個給你挖掘過的區(qū)塊添加額外數(shù)據(jù)的選項(xiàng)(只有32字節(jié))。按照慣例,它被解釋為統(tǒng)一碼字符串,你可以設(shè)置短期虛榮標(biāo)簽。
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檢查散表率,結(jié)果用H/s表示(每秒散表操作)。
> miner.hashrate
712000
成功挖掘一些區(qū)塊以后,你可以檢查etherbase賬戶中的以太幣余額?,F(xiàn)在假定你的etherbase是個本地賬戶:
> eth.getBalance(eth.coinbase).toNumber();
'34698870000000'
為了花費(fèi)你賺的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ā)生。這意味著你在當(dāng)?shù)匕淹谶^的區(qū)塊包括在內(nèi),當(dāng)前的狀態(tài)會顯示歸于你賬戶的挖礦獎勵,然而不久后,會發(fā)現(xiàn)更好的鏈,我們轉(zhuǎn)換到不包含你區(qū)塊的鏈,因而不會記入任何挖礦獎勵。因此很有可能礦工監(jiān)控coinbase余額的時候會發(fā)現(xiàn),它發(fā)生了相當(dāng)程度的浮動。