This project was created to understand how cryto-currency miners work. For a while, I have understood at a high-level what miners do but the best way for me to really understand was to implement it myself.
I read the source code for geth to understand how difficulty
is implemented and how hashrate
was computed. This example miner uses all of your CPU cores to "mine" a nonce where hash(nonce + message) <= threshold
. I use sha-256.
Real miners start with a random number to increase the chances of one miner mining a block. And, instead of using bytes of a string, the bytes of the currently block that is being mined will be used. Finally, this example uses sha-256
while etherum uses KECCAK-256
.
I wish. I haven't figured out how to leverage GPU with Go yet. Geth doesn't support GPU officially but they are working on it. The C++ implementation does support GPU.
$ sha-miner -h
Usage of sha-miner:
-d, --difficulty uint Difficulty value to use for mining (default 100000000)
-m, --message string Message to compute the hash (default "Hello world.")
-t, --threads int Total number of threads to use. Defaults to number of CPUs (default 1)
For the latest binaries, download them here.
You need to have pflag
and go-metrics
. You can install them by doing
go get -u github.com/rcrowley/go-metrics
go get -u github.com/spf13/pflag
Goreleaser is used to build binaries for all operating systems. You need to have rpmbuild
and fpm
installed. You can do so by doing brew install rpm
and follow the installation instruction for fpm.
$ sha-miner -m "This is sample data"
Effective Hashrate is 0.00 MH/s
Effective Hashrate is 5.87 MH/s
Effective Hashrate is 5.81 MH/s
Effective Hashrate is 5.81 MH/s
Found nonce 11529215046083745388 with hashrate of 5.77 MH/s