github.com/yinchengtsinghua/golang-Eos-dpos-Ethereum@v0.0.0-20190121132951-92cc4225ed8e/consensus/ethash/sealer_test.go (about) 1 2 //此源码被清华学神尹成大魔王专业翻译分析并修改 3 //尹成QQ77025077 4 //尹成微信18510341407 5 //尹成所在QQ群721929980 6 //尹成邮箱 yinc13@mails.tsinghua.edu.cn 7 //尹成毕业于清华大学,微软区块链领域全球最有价值专家 8 //https://mvp.microsoft.com/zh-cn/PublicProfile/4033620 9 package ethash 10 11 import ( 12 "encoding/json" 13 "io/ioutil" 14 "math/big" 15 "net" 16 "net/http" 17 "testing" 18 "time" 19 20 "github.com/ethereum/go-ethereum/common" 21 "github.com/ethereum/go-ethereum/core/types" 22 ) 23 24 //测试是否正确通知远程HTTP服务器新工作。 25 func TestRemoteNotify(t *testing.T) { 26 //启动简单的Web服务器以捕获通知 27 sink := make(chan [3]string) 28 29 server := &http.Server{ 30 Handler: http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { 31 blob, err := ioutil.ReadAll(req.Body) 32 if err != nil { 33 t.Fatalf("failed to read miner notification: %v", err) 34 } 35 var work [3]string 36 if err := json.Unmarshal(blob, &work); err != nil { 37 t.Fatalf("failed to unmarshal miner notification: %v", err) 38 } 39 sink <- work 40 }), 41 } 42 //打开自定义侦听器以提取其本地地址 43 listener, err := net.Listen("tcp", "localhost:0") 44 if err != nil { 45 t.Fatalf("failed to open notification server: %v", err) 46 } 47 defer listener.Close() 48 49 go server.Serve(listener) 50 51 //创建自定义ethash引擎 52 ethash := NewTester([]string{"http://“+listener.addr().string()) 53 defer ethash.Close() 54 55 //流式处理工作任务并确保通知冒泡 56 header := &types.Header{Number: big.NewInt(1), Difficulty: big.NewInt(100)} 57 block := types.NewBlockWithHeader(header) 58 59 ethash.Seal(nil, block, nil) 60 select { 61 case work := <-sink: 62 if want := header.HashNoNonce().Hex(); work[0] != want { 63 t.Errorf("work packet hash mismatch: have %s, want %s", work[0], want) 64 } 65 if want := common.BytesToHash(SeedHash(header.Number.Uint64())).Hex(); work[1] != want { 66 t.Errorf("work packet seed mismatch: have %s, want %s", work[1], want) 67 } 68 target := new(big.Int).Div(new(big.Int).Lsh(big.NewInt(1), 256), header.Difficulty) 69 if want := common.BytesToHash(target.Bytes()).Hex(); work[2] != want { 70 t.Errorf("work packet target mismatch: have %s, want %s", work[2], want) 71 } 72 case <-time.After(time.Second): 73 t.Fatalf("notification timed out") 74 } 75 } 76 77 //将工作包快速推送到矿工身上的测试不会导致任何DAA竞赛 78 //通知中的问题。 79 func TestRemoteMultiNotify(t *testing.T) { 80 //启动简单的Web服务器以捕获通知 81 sink := make(chan [3]string, 64) 82 83 server := &http.Server{ 84 Handler: http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { 85 blob, err := ioutil.ReadAll(req.Body) 86 if err != nil { 87 t.Fatalf("failed to read miner notification: %v", err) 88 } 89 var work [3]string 90 if err := json.Unmarshal(blob, &work); err != nil { 91 t.Fatalf("failed to unmarshal miner notification: %v", err) 92 } 93 sink <- work 94 }), 95 } 96 //打开自定义侦听器以提取其本地地址 97 listener, err := net.Listen("tcp", "localhost:0") 98 if err != nil { 99 t.Fatalf("failed to open notification server: %v", err) 100 } 101 defer listener.Close() 102 103 go server.Serve(listener) 104 105 //创建自定义ethash引擎 106 ethash := NewTester([]string{"http://“+listener.addr().string()) 107 defer ethash.Close() 108 109 //流式处理大量工作任务并确保所有通知都冒泡出来 110 for i := 0; i < cap(sink); i++ { 111 header := &types.Header{Number: big.NewInt(int64(i)), Difficulty: big.NewInt(100)} 112 block := types.NewBlockWithHeader(header) 113 114 ethash.Seal(nil, block, nil) 115 } 116 for i := 0; i < cap(sink); i++ { 117 select { 118 case <-sink: 119 case <-time.After(250 * time.Millisecond): 120 t.Fatalf("notification %d timed out", i) 121 } 122 } 123 }