goethereum-生成新钱包

生成钱包地址的作用

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

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

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

特性 单地址钱包(非 HD) 助记词钱包(HD 钱包)
生成方式 随机生成一对私钥/公钥,再由公钥生成地址 从一个助记词生成“主私钥”,再派生出多个子私钥、地址
助记词 有,例如:12/24 个英文单词
地址数量 通常一个地址一对密钥 支持生成无限多个地址(层级结构)
标准协议 自定义或不使用标准 遵循 BIP32/BIP39/BIP44 等规范
备份方式 备份私钥即可 只需备份助记词即可恢复所有地址
恢复能力 只能恢复一个钱包 一次性恢复所有账户地址
常见使用场景 智能合约部署钱包、程序钱包、中心化交易所归集地址 用户钱包(如 MetaMask、Ledger、TrustWallet)
package walletimport ("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/sha3hash := sha3.NewLegacyKeccak256()hash.Write(publicBytes[1:])fmt.Println(hexutil.Encode(hash.Sum(nil)[12:]))
}