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的完整转换过程,包括字节解码和椭圆曲线密钥的解析。

