美文网首页
生成比特币地址

生成比特币地址

作者: ifcoder | 来源:发表于2019-04-27 16:23 被阅读0次
    image
    package main
    
    import (
        "crypto/sha256"
        "golang.org/x/crypto/ripemd160"
        "fmt"
        "math/big"
        "encoding/hex"
    )
    
    
    //base58编码
    var b58Alphabet = []byte("123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz")
    
    func Base58Encode(input []byte) []byte{
        var result []byte
    
        x:= big.NewInt(0).SetBytes(input)
    
        base := big.NewInt(int64(len(b58Alphabet)))
        zero := big.NewInt(0)
    
        mod := &big.Int{}
        for x.Cmp(zero) != 0 {
            x.DivMod(x,base,mod)  // 对x取余数
            result =  append(result, b58Alphabet[mod.Int64()])
        }
    
    
    
        ReverseBytes(result)
    
        for _,b:=range input{
    
            if b ==0x00{
                result =  append([]byte{b58Alphabet[0]},result...)
            }else{
                break
            }
        }
    
    
        return result
    
    }
    
    
    //字节数组的反转
    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]
        }
    }
    
    //产生比特币地址
    func generateAddress(pubkey []byte) []byte{
        //1、计算pubkeyhash
          pubkeyHash256 :=sha256.Sum256(pubkey)
    
          PIPEMD160Hasher := ripemd160.New()
    
            _,err:= PIPEMD160Hasher.Write(pubkeyHash256[:])
    
            if err!=nil{
                fmt.Println("error")
            }
    
            publicRIPEMD160 := PIPEMD160Hasher.Sum(nil)
    
            //2、计算checksum,设主网版本version为[]byte{0x00}
            versionPayload := append([]byte{0x00},publicRIPEMD160...)
    
            firstSHA := sha256.Sum256(versionPayload)
            secondSHA := sha256.Sum256(firstSHA[:])
            //checksum 是前面的4个字节
            checksum:=secondSHA[:4]
    
            //3、base58编码
            fullPayload := append(versionPayload,checksum...)
    //返回地址
           address:=Base58Encode(fullPayload)
           return address
    }
    
    func main(){
        //外部得到公钥
        publickpey,_:=hex.DecodeString("D4A6C78C0B13DBD8A07AAB17C7D79ED9CB2523B63EDAC4E7CACE93C6B66CEDC7918EE0E174E8B2B61468D0E6CAA099710EF72094ACBD70BDAE3D8E42C617ACC6")
        //fmt.Printf("%X",publickpey)
    //打印这个地址
        address:=generateAddress(publickpey)
    
        fmt.Printf("%s",address)
    }
    

    相关文章

      网友评论

          本文标题:生成比特币地址

          本文链接:https://www.haomeiwen.com/subject/ksuknqtx.html