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  }