func (addr *address) Version() (uint64, error) { b, err := base58.Decode(addr.Identifier[3:]) if err != nil { return 0, err } v, _ := varint.Decode(b) return v, nil }
func (addr *address) Stream() (uint64, error) { b, err := base58.Decode(addr.Identifier[3:]) if err != nil { return 0, err } _, nb := varint.Decode(b) s, _ := varint.Decode(b[nb:]) return s, nil }
func ValidateChecksum(address string) (bool, error) { b, err := base58.Decode(address[3:]) if err != nil { return false, err } raw := b[:len(b)-4] cs1 := b[len(b)-4:] sha1, sha2 := sha512.New(), sha512.New() sha1.Write(raw) sha2.Write(sha1.Sum(nil)) cs2 := sha2.Sum(nil)[:4] return bytes.Compare(cs1, cs2) == 0, nil }
func ValidateChecksum(wif string) (bool, error) { if len(wif) < 6 { return false, errors.New("wif.Validate: wif is too short") } extended, err := base58.Decode(wif) if err != nil { return false, err } cs1 := extended[len(extended)-4:] sha1, sha2 := sha256.New(), sha256.New() sha1.Write(extended[:len(extended)-4]) sha2.Write(sha1.Sum(nil)) cs2 := sha2.Sum(nil)[:4] return bytes.Compare(cs1, cs2) == 0, nil }
func Decode(wif string) (*bitecdsa.PrivateKey, error) { if len(wif) < 6 { return nil, errors.New("wif.Decode: wif is too short") } extended, err := base58.Decode(wif) if err != nil { return nil, err } decoded := extended[1 : len(extended)-4] keys := new(bitecdsa.PrivateKey) keys.D = new(big.Int).SetBytes(decoded) keys.PublicKey.BitCurve = bitelliptic.S256() for keys.PublicKey.X == nil { keys.PublicKey.X, keys.PublicKey.Y = keys.PublicKey.BitCurve.ScalarBaseMult(decoded) } if !keys.BitCurve.IsOnCurve(keys.PublicKey.X, keys.PublicKey.Y) { return nil, errors.New("wif.Decode: Point is not on curve") } return keys, nil }