发布时间:2026-06-08 04:39:25
### 准备工作
首先,你需要安装Go语言的环境。如果你还没有安装,可以从Go的官方网站下载并按照说明进行安装。在这个例子里,我们会用到`go-ethereum`这个库,它是以太坊的官方Go语言实现。
```bash
go get github.com/ethereum/go-ethereum
```
### 生成以太坊地址
我们来先写一个生成以太坊地址的简单函数。以太坊地址是通过公钥生成的,公钥又是通过私钥生成的。
```go
package main
import (
"fmt"
"log"
"math/rand"
"time"
"github.com/ethereum/go-ethereum/crypto"
)
func generateAddress() (string, string) {
// 生成随机私钥
privateKey, err := crypto.GenerateKey()
if err != nil {
log.Fatalf("无法生成私钥: %v", err)
}
// 生成公钥
publicKey := privateKey.PublicKey
// 获取地址
address := crypto.PubkeyToAddress(publicKey).Hex()
privateKeyStr := fmt.Sprintf("0x%x", privateKey.D)
return address, privateKeyStr
}
func main() {
address, privateKey := generateAddress()
fmt.Printf("生成的钱包地址: %s\n私钥: %s\n", address, privateKey)
}
```
这段代码简单快速地生成了一个以太坊钱包地址和对应的私钥。注意,私钥一定要好好保管,切勿泄露哦。
### 查看以太坊余额
接下来,我们需要一个功能,可以查看一个地址的以太坊余额。这里,我们会用到以太坊节点提供的RPC接口。你可以用Infura等服务来获取一个免费的节点。
```go
package main
import (
"context"
"fmt"
"log"
"math/big"
"github.com/ethereum/go-ethereum/accounts/abi"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/ethclient"
)
func getBalance(client *ethclient.Client, address string) (*big.Float, error) {
addressHex := common.HexToAddress(address)
balance, err := client.BalanceAt(context.Background(), addressHex, nil)
if err != nil {
return nil, err
}
etherValue := new(big.Float).Quo(new(big.Float).SetInt(balance), big.NewFloat(1e18))
return etherValue, nil
}
func main() {
client, err := ethclient.Dial("https://mainnet.infura.io/v3/YOUR_INFURA_PROJECT_ID")
if err != nil {
log.Fatalf("无法连接到以太坊: %v", err)
}
address := "YOUR_ETH_ADDRESS"
balance, err := getBalance(client, address)
if err != nil {
log.Fatalf("获取余额失败: %v", err)
}
fmt.Printf("地址 %s 的余额: %s ETH\n", address, balance.String())
}
```
替换 `"YOUR_INFURA_PROJECT_ID"` 和 `"YOUR_ETH_ADDRESS"` 为你的Infura项目ID和想查询的以太坊地址。运行这一段代码后,就能看到你指定地址的以太坊余额了。
### 发送以太坊交易
发送交易是创建钱包的最终目的。我们接着来写这个功能。
```go
package main
import (
"context"
"fmt"
"log"
"math/big"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/ethclient"
"github.com/ethereum/go-ethereum/rpc"
)
func sendTransaction(client *ethclient.Client, privateKeyStr string, to string, value *big.Int) (string, error) {
privateKey, err := crypto.HexToECDSA(privateKeyStr[2:]) // 去掉前缀 "0x"
if err != nil {
return "", err
}
fromAddress := crypto.PubkeyToAddress(privateKey.PublicKey)
nonce, err := client.PendingNonceAt(context.Background(), fromAddress)
if err != nil {
return "", err
}
gasPrice, err := client.SuggestGasPrice(context.Background())
if err != nil {
return "", err
}
tx := types.NewTransaction(nonce, common.HexToAddress(to), value, uint64(21000), gasPrice, nil)
signedTx, err := crypto.Sign(tx.Hash().Bytes(), privateKey)
if err != nil {
return "", err
}
if err := client.SendTransaction(context.Background(), signedTx); err != nil {
return "", err
}
return signedTx.Hash().Hex(), nil
}
func main() {
client, err := ethclient.Dial("https://mainnet.infura.io/v3/YOUR_INFURA_PROJECT_ID")
if err != nil {
log.Fatalf("连接失败: %v", err)
}
privateKey := "YOUR_PRIVATE_KEY"
to := "RECIPIENT_ADDRESS" // 收款方地址
value := big.NewInt(1000000000000000000) // 发送1 ETH
txHash, err := sendTransaction(client, privateKey, to, value)
if err != nil {
log.Fatalf("交易失败: %v", err)
}
fmt.Printf("交易提交成功, 交易哈希: %s\n", txHash)
}
```
### 注意事项
在运行这些代码时,要特别注意安全问题。私钥绝不能泄露,最好存储在安全的地方,例如使用硬件钱包。同时,在处理真实以太坊资产时,请确保你在主网操作之前,先在测试网上(例如Ropsten、Rinkeby)多做测试。
### 小结
今天我们一起实现了一个简单的以太坊钱包,功能涵盖了地址生成、余额查询和发送交易。通过亲手实现这些代码,你应该能对以太坊的工作原理有更深入的了解。对于我来说,编写这个程序的过程就像是拼图游戏,有时候需要摸索,有时候则是突然茅塞顿开。
如果你在使用过程中遇到问题,不妨在网上搜索问题或者问问身边的朋友。区块链的发展很快,抓住这个机会,让我们一起探索吧!
tpwallet
TokenPocket是全球最大的数字货币钱包,支持包括BTC, ETH, BSC, TRON, Aptos, Polygon, Solana, OKExChain, Polkadot, Kusama, EOS等在内的所有主流公链及Layer 2,已为全球近千万用户提供可信赖的数字货币资产管理服务,也是当前DeFi用户必备的工具钱包。
相关新闻
2026-05-03
如何在XP系统上安全存储比
比特币钱包的基本知识 哈喽,今天咱们聊聊比特币钱包,特别是如果你还在用XP系统,如何安全存储这玩意。很多人...
2026-05-29
“USDT Omni 钱包:如何选择
什么是USDT Omni钱包? 你可能听说过USDT,也就是美元稳定币,简单来说就是把一美元兑换成一个USDT,目的就是为了让...
2026-04-03
警惕!区块链钱包买币授
## 内容大纲1. 引言 - 介绍区块链及其钱包的基础概念 - 阐明新区块链发展带来的买币便利以及相关风险2. 区块链钱包...
2026-05-19
新比特币钱包如何快速上
啥是比特币钱包? 好吧,先得让你知道什么叫比特币钱包。通俗来说,比特币钱包就像你现实生活中的钱包,里面可...