Golang中将字符串格式的以太坊私钥BIP44转换为ecdsa.PrivateKey类型时遇到困难

Golang中将字符串格式的以太坊私钥BIP44转换为ecdsa.PrivateKey类型时遇到困难 我正在努力尝试将以字符串格式表示的以太坊BIP44私钥转换为可以被代码其余部分使用的类型(*ecdsa.PrivateKey)。

import (
    "crypto/x509"
    "fmt"
    "log"

    "github.com/ethereum/go-ethereum/common/hexutil"
    "github.com/ethereum/go-ethereum/crypto"
)

const (
    privateKey2 string = "0xbacd06016aea4280e14efd7182ba18cd98bf11701943d3d47d76b04bb7baad19"
)

func main() {
    privateKey, err := crypto.GenerateKey()
    if err != nil {
        log.Fatal(err)
    }

    privateKeyBytes := crypto.FromECDSA(privateKey)
    fmt.Println("Only bytes", privateKeyBytes)

    fmt.Println(hexutil.Encode(privateKeyBytes)[2:])

    firstKey := []byte(privateKey2)
    fmt.Println("Only bytes first key", firstKey)

    _, err = x509.ParsePKCS8PrivateKey(firstKey)
    if err != nil {
        fmt.Println("Cannot parse private key")
    }

    // fmt.Println("The address geneerated is ", auth.From)
}

更多关于Golang中将字符串格式的以太坊私钥BIP44转换为ecdsa.PrivateKey类型时遇到困难的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于Golang中将字符串格式的以太坊私钥BIP44转换为ecdsa.PrivateKey类型时遇到困难的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


要将字符串格式的以太坊私钥转换为*ecdsa.PrivateKey,你需要使用crypto.HexToECDSA()函数。以下是修正后的代码示例:

import (
    "fmt"
    "log"

    "github.com/ethereum/go-ethereum/crypto"
)

const (
    privateKey2 string = "0xbacd06016aea4280e14efd7182ba18cd98bf11701943d3d47d76b04bb7baad19"
)

func main() {
    // 将十六进制字符串私钥转换为ECDSA私钥
    privateKey, err := crypto.HexToECDSA(privateKey2[2:]) // 去掉"0x"前缀
    if err != nil {
        log.Fatal("Failed to parse private key:", err)
    }

    // 现在privateKey就是*ecdsa.PrivateKey类型
    fmt.Printf("Private key type: %T\n", privateKey)
    
    // 获取公钥地址
    address := crypto.PubkeyToAddress(privateKey.PublicKey)
    fmt.Printf("Address: %s\n", address.Hex())
    
    // 验证:将私钥转换回十六进制字符串
    privateKeyBytes := crypto.FromECDSA(privateKey)
    fmt.Printf("Private key hex: 0x%x\n", privateKeyBytes)
}

如果你需要处理没有"0x"前缀的私钥字符串:

func main() {
    // 如果私钥字符串没有0x前缀
    privateKeyStr := "bacd06016aea4280e14efd7182ba18cd98bf11701943d3d47d76b04bb7baad19"
    
    privateKey, err := crypto.HexToECDSA(privateKeyStr)
    if err != nil {
        log.Fatal("Failed to parse private key:", err)
    }
    
    fmt.Printf("Successfully parsed private key: %T\n", privateKey)
}

对于BIP44派生路径的私钥,转换方法是相同的,因为BIP44只是定义了派生路径的规范,最终的私钥仍然是标准的ECDSA私钥:

func main() {
    // BIP44派生路径示例:m/44'/60'/0'/0/0 的私钥
    bip44PrivateKey := "0x4f3edf983ac636a65a842ce7c78d9aa706d3b113bce9c46f30d7d21715b23b1d"
    
    // 转换方法与普通私钥相同
    privateKey, err := crypto.HexToECDSA(bip44PrivateKey[2:])
    if err != nil {
        log.Fatal(err)
    }
    
    // 使用私钥签名交易等操作
    fmt.Printf("Private key parsed successfully: %v\n", privateKey != nil)
}

注意:crypto.HexToECDSA()函数内部已经处理了十六进制字符串到*ecdsa.PrivateKey的完整转换过程,包括字节解码和椭圆曲线密钥的解析。

回到顶部