Creating a cryptocurrency wallet from scratch is an essential skill for developers working in blockchain and decentralized applications. In this guide, we'll walk through how to generate a new Ethereum-compatible wallet using the Go programming language. This includes generating a private key, deriving the public key, and computing the Ethereum address—all using secure cryptographic libraries.
Whether you're building a decentralized finance (DeFi) tool, a wallet service, or simply learning about blockchain internals, understanding wallet generation is foundational.
👉 Learn how to securely manage blockchain assets with advanced tools
Understanding Wallet Generation
A cryptocurrency wallet isn’t a physical container but a cryptographic key pair: a private key and its corresponding public key. The public key is used to receive funds, while the private key authorizes spending. Security hinges on keeping the private key secret.
In Ethereum and many other blockchains, wallets are based on Elliptic Curve Digital Signature Algorithm (ECDSA) using the secp256k1 curve. The process involves:
- Generating a secure random private key.
- Deriving the public key from the private key.
- Creating the wallet address via hashing the public key.
We’ll use Go’s go-ethereum library to perform these steps securely and efficiently.
Step-by-Step Code Implementation
Let’s break down the complete workflow with explanations for each part of the code.
1. Import Required Packages
package main
import (
"crypto/ecdsa"
"fmt"
"log"
"github.com/ethereum/go-ethereum/common/hexutil"
"github.com/ethereum/go-ethereum/crypto"
"golang.org/x/crypto/sha3"
)These imports provide:
ecdsa: For handling elliptic curve cryptography.hexutil: To encode binary data into hexadecimal format.crypto: Ethereum-specific cryptographic functions.sha3: For Keccak-256 hashing (used in address derivation).
2. Generate a Private Key
The foundation of any wallet is a cryptographically secure private key.
privateKey, err := crypto.GenerateKey()
if err != nil {
log.Fatal(err)
}crypto.GenerateKey() generates a random 256-bit private key using the secp256k1 curve. This key must be stored securely—anyone with access can control associated funds.
Convert the private key to bytes for display or storage:
privateKeyBytes := crypto.FromECDSA(privateKey)
fmt.Println(hexutil.Encode(privateKeyBytes)[2:]) // Output: fad9c8...6a19This outputs the private key as a hex string without the 0x prefix. Never expose this in production environments.
👉 Discover secure ways to store and manage digital assets
3. Derive the Public Key
From the private key, we derive the public key using ECDSA mathematics.
publicKey := privateKey.Public()
publicKeyECDSA, ok := publicKey.(*ecdsa.PublicKey)
if !ok {
log.Fatal("cannot assert type: publicKey is not of type *ecdsa.PublicKey")
}We then convert it to bytes and encode it in hexadecimal:
publicKeyBytes := crypto.FromECDSAPub(publicKeyECDSA)
fmt.Println(hexutil.Encode(publicKeyBytes)[4:]) // Removes "0x04" prefixThe 0x04 prefix indicates an uncompressed public key and is typically stripped in further processing.
4. Generate the Ethereum Address
The final step is deriving the user-facing wallet address.
address := crypto.PubkeyToAddress(*publicKeyECDSA).Hex()
fmt.Println(address) // Output: 0x962168...b05EUnder the hood, this performs:
- Keccak-256 hash of the public key (excluding the first byte).
- Takes the last 20 bytes (40 hex characters) of the hash.
- Prefixes with
0x.
You can replicate this manually:
hash := sha3.NewLegacyKeccak256()
hash.Write(publicKeyBytes[1:]) // Skip the first byte
addressManual := hexutil.Encode(hash.Sum(nil)[12:])
fmt.Println("Manual address:", addressManual) // Matches aboveThis confirms that your implementation aligns with Ethereum’s standard.
Core Keywords for SEO Optimization
To ensure visibility and relevance in search engines, here are the core keywords naturally integrated throughout this article:
- generate new wallet
- Go Ethereum crypto
- private key generation
- Ethereum address derivation
- Keccak-256 hash
- ECDSA cryptography
- secure wallet creation
- blockchain development in Go
These terms reflect common search intents among developers exploring blockchain programming and cryptographic security.
Frequently Asked Questions
Q: Is it safe to generate wallets using Go code?
Yes, as long as you use well-audited libraries like go-ethereum/crypto and ensure your environment is secure. Avoid logging or storing private keys in plaintext.
Q: Can I reuse the same private key for multiple blockchains?
Most EVM-compatible chains (Ethereum, Binance Smart Chain, Polygon, etc.) use the same ECDSA/secp256k1 standard, so yes—the same key works across them with the same address.
Q: Why do we remove the first byte when hashing the public key?
The first byte indicates compression mode (uncompressed keys start with 0x04). It's excluded before hashing because only the raw coordinate data is needed for address computation.
Q: What happens if someone gets my private key?
They gain full control over your wallet and can transfer all funds. Always store private keys securely—preferably in hardware wallets or encrypted keystores.
Q: How does Keccak-256 differ from SHA-3?
Although similar, Ethereum uses Keccak-256, which differs slightly from the final NIST-standardized SHA-3. Using the correct version (sha3.NewLegacyKeccak256) is critical for compatibility.
Q: Can I generate multiple addresses from one private key?
No—each private key maps to exactly one public key and one Ethereum address. However, hierarchical deterministic (HD) wallets use seed phrases to derive multiple key pairs securely.
Best Practices for Secure Wallet Development
When implementing wallet generation in real-world applications:
- Use strong entropy sources for randomness.
- Never hardcode or log private keys.
- Consider using BIP39 mnemonics and HD wallets for better user experience.
- Validate inputs and handle errors gracefully.
- Run security audits on production systems.
Developers should also explore tools like wallet import formats (WIF) or JSON keystores for safer storage mechanisms.
👉 Explore developer-friendly tools for blockchain integration
Conclusion
Generating a new wallet in Go is both educational and practical. By leveraging robust libraries like go-ethereum, developers can create secure, standards-compliant wallets programmatically. Understanding the underlying process—from private key generation to address derivation—empowers better design decisions and improves security posture.
Whether you're building a full-fledged DeFi platform or experimenting locally, mastering wallet creation is a vital step in blockchain development.
With proper safeguards and attention to cryptographic best practices, you can confidently build systems that users trust.