Skip to content

Instantly share code, notes, and snippets.

@dmiyakawa
Created December 27, 2017 07:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dmiyakawa/79a518cf8780c158673017e0b5e5855d to your computer and use it in GitHub Desktop.
Save dmiyakawa/79a518cf8780c158673017e0b5e5855d to your computer and use it in GitHub Desktop.
Proof of Work? with Goroutine
package main
import (
"crypto/sha256"
"fmt"
"math/rand"
"time"
"runtime"
)
func do_pow(dat []byte) (sum [32]byte) {
token := make([]byte, 8)
for {
rand.Read(token)
c := append(dat, token...)
sum = sha256.Sum256(c)
if sum[0] == 0 && sum[1] == 0 && sum[2] == 0 {
return
}
}
}
func main() {
fmt.Printf("numcpu: %d\n", runtime.NumCPU())
runtime.GOMAXPROCS(runtime.NumCPU())
start := time.Now();
out := make(chan []byte, 10)
in := make(chan [32]byte, 10)
for i := 0; i < runtime.NumCPU(); i++ {
go func(in <- chan []byte, out chan<- [32]byte) {
for {
dat, ok := <-in
if !ok {
break
}
out <- do_pow(dat)
}
}(out, in)
}
for i := 0; i < 10; i++ {
out <- []byte("hello world " + string(i))
}
close(out)
for i := 0; i < 10; i++ {
ret, ok := <-in
if !ok {
fmt.Println("Error happened")
break
}
fmt.Printf("%x\n", ret)
}
close(in)
end := time.Now()
fmt.Printf("%f sec\n",(end.Sub(start)).Seconds())
}
package main
import (
"crypto/sha256"
"fmt"
"math/rand"
"time"
)
func do_pow(dat []byte) (sum [32]byte) {
token := make([]byte, 8)
for {
rand.Read(token)
c := append(dat, token...)
sum = sha256.Sum256(c)
if sum[0] == 0 && sum[1] == 0 && sum[2] == 0 {
return
}
}
}
func main() {
start := time.Now();
for i := 0; i < 10; i++ {
dat := do_pow([]byte("hello world " + string(i)))
fmt.Printf("%x\n", dat)
}
end := time.Now()
fmt.Printf("%f sec\n",(end.Sub(start)).Seconds())
}
$ system_profiler -detailLevel mini SPHardwareDataType
Hardware:
Hardware Overview:
Model Name: iMac
Model Identifier: iMac15,1
Processor Name: Intel Core i5
Processor Speed: 3.5 GHz
Number of Processors: 1
Total Number of Cores: 4
L2 Cache (per Core): 256 KB
L3 Cache: 6 MB
Memory: 32 GB
Boot ROM Version: IM151.0211.B00
SMC Version (system): 2.23f11
$ go version
go version go1.9.2 darwin/amd64
$ go run proof_of_work_serial.go
0000009129b79628db72ad9adb63571fd4384067c45d81a9f1f37bbda7317340
00000002d5d0b757ee53617a81f8539ae0539eeae18c3c060be7d48289d60988
0000008f3ec99acf77fa84a06401600ee173812a7c6d0641f305d50077bd8a19
000000caf90c867b575d1eaa3d22b0264c04021f610bdcfec04fd3e419851a94
000000d373ae16e798689e8a687b6f0c1938aef263096b3a90b8c41322b46890
0000004d1989bdd6a4cceee1572f85b1e7d64d3e5c82a13e4ad7f90a1b896440
000000e325c061d5d54af40793466fa8c630bca4dd22b8e3758ec2183d1e8a4b
000000015fe4e83da65ed075b21512108c11e7abb6f6c7e6d5307d794ab9a11e
000000366f0530f4e32bce18aca12fe359909d02bd0924bc0724f2a8a088a682
000000d00962365a274de6d2c9ef557d00673a4f88ebe5519acbb09fe9284c1b
87.588653 sec
$ go run proof_of_work_parallel.go
numcpu: 4
0000002bf1a6c1079b9d624f55258ac4e7310bf5c713b26f6b1f92c34919ce1a
000000661481fddccf8601e418dedb62ed4637f287b3f73e0aacb42c88a681c3
0000001b70d9ea7dce6ace63d05c4d6d91a67056018806492a898de1aa69d08f
0000007c32d1b8e9042aacb4f847a6b6b5d796730fd279d2eb57b17062f2099b
000000180a8d92b922ed25478ea3b53ad18113fe862f57ac470ed02b1287e0fa
000000c3567f3725bc5d3be1184bf827cbe0417e25be8f572019bff8783d4d3f
000000225700318044ee1b8d3ea518bb752fd51e30e419a171cf70ba76954025
000000c4319647477a58d00a6f7775231b676d0a33c9c5e1fa2c5237719c8c0a
000000621fd243573043b6a8d85b14e5d24f163094702b428d6d0ec3d5a35616
000000d274491e2b2f586e797600b5fd5d24c11f9751579b5cd816bbf663e8b4
23.308537 sec
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment