go 实现波场(Tron)(TRX)地址转换

作者: 太阳上的雨天 分类: Go,Web3.0 发布时间: 2022-10-13 10:55
package _address

import (
    "bytes"
    "crypto/sha256"
    "encoding/hex"
    "math/big"
)

var base58Alphabets = []byte("123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz")

func ToHexAddress(address string) string {
    return hex.EncodeToString(base58Decode([]byte(address)))
}

func FromHexAddress(hexAddress string) (string, error) {
    addrByte, err := hex.DecodeString(hexAddress)
    if err != nil {
        return "", err
    }

    sha := sha256.New()
    sha.Write(addrByte)
    shaStr := sha.Sum(nil)

    sha2 := sha256.New()
    sha2.Write(shaStr)
    shaStr2 := sha2.Sum(nil)

    addrByte = append(addrByte, shaStr2[:4]...)
    return string(base58Encode(addrByte)), nil
}

func base58Encode(input []byte) []byte {
    x := big.NewInt(0).SetBytes(input)
    base := big.NewInt(58)
    zero := big.NewInt(0)
    mod := &big.Int{}
    var result []byte
    for x.Cmp(zero) != 0 {
        x.DivMod(x, base, mod)
        result = append(result, base58Alphabets[mod.Int64()])
    }
    reverseBytes(result)
    return result
}

func base58Decode(input []byte) []byte {
    result := big.NewInt(0)
    for _, b := range input {
        charIndex := bytes.IndexByte(base58Alphabets, b)
        result.Mul(result, big.NewInt(58))
        result.Add(result, big.NewInt(int64(charIndex)))
    }
    decoded := result.Bytes()
    if input[0] == base58Alphabets[0] {
        decoded = append([]byte{0x00}, decoded...)
    }
    return decoded[:len(decoded)-4]
}

func reverseBytes(data []byte) {
    for i, j := 0, len(data)-1; i < j; i, j = i+1, j-1 {
        data[i], data[j] = data[j], data[i]
    }
}

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注