package util import ( "math/big" "regexp" "strconv" "time" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/common/math" ) var Ether = math.BigPow(10, 18) var Shannon = math.BigPow(10, 9) var pow256 = math.BigPow(2, 256) var addressPattern = regexp.MustCompile("^0x[0-9a-fA-F]{40}$") var zeroHash = regexp.MustCompile("^0?x?0+$") func IsValidHexAddress(s string) bool { if IsZeroHash(s) || !addressPattern.MatchString(s) { return false } return true } func IsZeroHash(s string) bool { return zeroHash.MatchString(s) } func MakeTimestamp() int64 { return time.Now().UnixNano() / int64(time.Millisecond) } func GetTargetHex(diff int64) string { difficulty := big.NewInt(diff) diff1 := new(big.Int).Div(pow256, difficulty) targetBytes := diff1.Bytes() // The target bytes should be exactly 32 bytes long. if len(targetBytes) < 32 { padding := make([]byte, 32-len(targetBytes)) targetBytes = append(padding, targetBytes...) } targetStr := hexutil.Encode(targetBytes) return targetStr } func TargetHexToDiff(targetHex string) *big.Int { targetBytes := common.FromHex(targetHex) return new(big.Int).Div(pow256, new(big.Int).SetBytes(targetBytes)) } func ToHex(n int64) string { return "0x0" + strconv.FormatInt(n, 16) } func FormatReward(reward *big.Int) string { return reward.String() } func FormatRatReward(reward *big.Rat) string { wei := new(big.Rat).SetInt(Ether) reward = reward.Quo(reward, wei) return reward.FloatString(8) } func StringInSlice(a string, list []string) bool { for _, b := range list { if b == a { return true } } return false } func MustParseDuration(s string) time.Duration { value, err := time.ParseDuration(s) if err != nil { panic("util: Can't parse duration `" + s + "`: " + err.Error()) } return value } func String2Big(num string) *big.Int { n := new(big.Int) n.SetString(num, 0) return n } func DiffFloatToInt(diffFloat float64) (diffInt int64) { diffInt = int64(diffFloat * float64(1<<48) / float64(0xffff)) // 48 = 256 - 26*8 return } func DiffIntToFloat(diffInt int64) (diffFloat float64) { diffFloat = float64(diffInt*0xffff) / float64(1<<48) // 48 = 256 - 26*8 return } func ToHex1(n int64) string { return strconv.FormatInt(n, 10) }