goethereum-生成新钱包

生成钱包地址的作用

  1. 标识用户身份 / 资产归属,每个以太坊钱包地址都是一个 公钥哈希值,它唯一标识某个用户或合约的资产所有权
  2. 用于发送和接收资产。生成地址后,可以向它接收 ETH、USDT 等资产或用其私钥发起交易(转账、调用智能合约)
  3. 生成对应的私钥、公钥对。用 go-ethereum 生成地址时,会得到:一个 私钥(非常重要,需妥善保存)、一个 公钥、一个对应的 钱包地址,这三者之间具有数学关系,保证安全性和不可逆性。
  4. 集成进账户系统或 DApp 钱包。如果你是做交易所、DApp、钱包服务:
  • 每个用户可以独立生成一个钱包地址
  • 后台可以管理私钥(冷钱包/热钱包)
  • 进行链上监听、归集、空投等操作

注:基于椭圆曲线加密算法,安全性高

钱包地址 与 助记词(HD 钱包)对比

特性 单地址钱包(非 HD) 助记词钱包(HD 钱包)
生成方式 随机生成一对私钥/公钥,再由公钥生成地址 从一个助记词生成“主私钥”,再派生出多个子私钥、地址
助记词 有,例如:12/24 个英文单词
地址数量 通常一个地址一对密钥 支持生成无限多个地址(层级结构)
标准协议 自定义或不使用标准 遵循 BIP32/BIP39/BIP44 等规范
备份方式 备份私钥即可 只需备份助记词即可恢复所有地址
恢复能力 只能恢复一个钱包 一次性恢复所有账户地址
常见使用场景 智能合约部署钱包、程序钱包、中心化交易所归集地址 用户钱包(如 MetaMask、Ledger、TrustWallet)
package wallet

import (
	"crypto/ecdsa"
	"fmt"
	"log"

	"github.com/ethereum/go-ethereum/common/hexutil"
	"github.com/ethereum/go-ethereum/crypto"
	"golang.org/x/crypto/sha3"
)

func CreateWallet() {
	//随机生成一个私钥
	privateKey, err := crypto.GenerateKey()
	if err != nil {
		log.Fatal("生成的私钥失败:", err)
	}
	//使用crypto.FromECDSA 方法转为bytes类型
	privateBytes := crypto.FromECDSA(privateKey)
	fmt.Println("privateKey:%x \n", privateBytes)

	fmt.Println("privateKeyHex:%x \n", hexutil.Encode(privateBytes)[2:])

	//获取私钥对应的公钥
	publicKey := privateKey.Public()
	publicKeyECDSA, ok := publicKey.(*ecdsa.PublicKey)
	if !ok {
		log.Fatal("转换公钥失败")
	}
	publicBytes := crypto.FromECDSAPub(publicKeyECDSA)
	fmt.Println(hexutil.Encode(publicBytes)[4:])

	//method 1: 通过公钥获取公钥地址
	address := crypto.PubkeyToAddress(*publicKeyECDSA).Hex()
	fmt.Println("public address:", address)
	//method2: 通过公钥获取公钥地址
	//与method1的方法执行结果相同,公共地址只是公钥的Keccak-256哈希值,然后我们取最后 40 个字符(20 个字节)并在其前面加上 。以下是使用go - ethereum的Keccak256 函数0x手动执行此操作的方法。crypto/sha3
	hash := sha3.NewLegacyKeccak256()
	hash.Write(publicBytes[1:])
	fmt.Println(hexutil.Encode(hash.Sum(nil)[12:]))
}

posted @ 2025-07-29 22:09  Charlie-Pang  阅读(44)  评论(0)    收藏  举报