github.com/yinchengtsinghua/golang-Eos-dpos-Ethereum@v0.0.0-20190121132951-92cc4225ed8e/consensus/ethash/consensus_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  //版权所有2017 Go Ethereum作者
    10  //此文件是Go以太坊库的一部分。
    11  //
    12  //Go-Ethereum库是免费软件:您可以重新分发它和/或修改
    13  //根据GNU发布的较低通用公共许可证的条款
    14  //自由软件基金会,或者许可证的第3版,或者
    15  //(由您选择)任何更高版本。
    16  //
    17  //Go以太坊图书馆的发行目的是希望它会有用,
    18  //但没有任何保证;甚至没有
    19  //适销性或特定用途的适用性。见
    20  //GNU较低的通用公共许可证,了解更多详细信息。
    21  //
    22  //你应该收到一份GNU较低级别的公共许可证副本
    23  //以及Go以太坊图书馆。如果没有,请参见<http://www.gnu.org/licenses/>。
    24  
    25  package ethash
    26  
    27  import (
    28  	"encoding/json"
    29  	"math/big"
    30  	"os"
    31  	"path/filepath"
    32  	"testing"
    33  
    34  	"github.com/ethereum/go-ethereum/common/math"
    35  	"github.com/ethereum/go-ethereum/core/types"
    36  	"github.com/ethereum/go-ethereum/params"
    37  )
    38  
    39  type diffTest struct {
    40  	ParentTimestamp    uint64
    41  	ParentDifficulty   *big.Int
    42  	CurrentTimestamp   uint64
    43  	CurrentBlocknumber *big.Int
    44  	CurrentDifficulty  *big.Int
    45  }
    46  
    47  func (d *diffTest) UnmarshalJSON(b []byte) (err error) {
    48  	var ext struct {
    49  		ParentTimestamp    string
    50  		ParentDifficulty   string
    51  		CurrentTimestamp   string
    52  		CurrentBlocknumber string
    53  		CurrentDifficulty  string
    54  	}
    55  	if err := json.Unmarshal(b, &ext); err != nil {
    56  		return err
    57  	}
    58  
    59  	d.ParentTimestamp = math.MustParseUint64(ext.ParentTimestamp)
    60  	d.ParentDifficulty = math.MustParseBig256(ext.ParentDifficulty)
    61  	d.CurrentTimestamp = math.MustParseUint64(ext.CurrentTimestamp)
    62  	d.CurrentBlocknumber = math.MustParseBig256(ext.CurrentBlocknumber)
    63  	d.CurrentDifficulty = math.MustParseBig256(ext.CurrentDifficulty)
    64  
    65  	return nil
    66  }
    67  
    68  func TestCalcDifficulty(t *testing.T) {
    69  	file, err := os.Open(filepath.Join("..", "..", "tests", "testdata", "BasicTests", "difficulty.json"))
    70  	if err != nil {
    71  		t.Skip(err)
    72  	}
    73  	defer file.Close()
    74  
    75  	tests := make(map[string]diffTest)
    76  	err = json.NewDecoder(file).Decode(&tests)
    77  	if err != nil {
    78  		t.Fatal(err)
    79  	}
    80  
    81  	config := &params.ChainConfig{HomesteadBlock: big.NewInt(1150000)}
    82  
    83  	for name, test := range tests {
    84  		number := new(big.Int).Sub(test.CurrentBlocknumber, big.NewInt(1))
    85  		diff := CalcDifficulty(config, test.CurrentTimestamp, &types.Header{
    86  			Number:     number,
    87  			Time:       new(big.Int).SetUint64(test.ParentTimestamp),
    88  			Difficulty: test.ParentDifficulty,
    89  		})
    90  		if diff.Cmp(test.CurrentDifficulty) != 0 {
    91  			t.Error(name, "failed. Expected", test.CurrentDifficulty, "and calculated", diff)
    92  		}
    93  	}
    94  }