goethereum-生成新钱包
生成钱包地址的作用
- 标识用户身份 / 资产归属,每个以太坊钱包地址都是一个 公钥哈希值,它唯一标识某个用户或合约的资产所有权
- 用于发送和接收资产。生成地址后,可以向它接收 ETH、USDT 等资产或用其私钥发起交易(转账、调用智能合约)
- 生成对应的私钥、公钥对。用 go-ethereum 生成地址时,会得到:一个 私钥(非常重要,需妥善保存)、一个 公钥、一个对应的 钱包地址,这三者之间具有数学关系,保证安全性和不可逆性。
- 集成进账户系统或 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:]))
}

浙公网安备 33010602011771号