开始进行交易一笔
Web3 学习之旅,第二步进行第一笔交易。
直接写代码交易:
package main
import (
"context"
"crypto/ecdsa" "fmt" "log" "math/big"
"github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/ethclient")
func main() {
// 连接以太坊节点
client, err := ethclient.Dial("HTTP://127.0.0.1:7545")
if err != nil {
log.Fatalf("连接失败: %v", err)
}
// 私钥
privateKey, err := crypto.HexToECDSA("19593ad77d8123604cd48c2c4f3b961df611e1bdd15ad317377489562005a60f")
if err != nil {
log.Fatalf("解析私钥失败: %v", err)
}
// 获取发送方地址
publicKey := privateKey.Public()
publicKeyECDSA, ok := publicKey.(*ecdsa.PublicKey)
if !ok {
log.Fatal("公钥类型错误")
}
fromAddress := crypto.PubkeyToAddress(*publicKeyECDSA)
// 获取 nonce
nonce, err := client.PendingNonceAt(context.Background(), fromAddress)
if err != nil {
log.Fatalf("获取 nonce 失败: %v", err)
}
// 转账金额
value := big.NewInt(10000000000000000) // 0.01 ETH
// Gas 参数 gasLimit := uint64(21000)
gasFeeCap, err := client.SuggestGasPrice(context.Background()) // 最大费用
if err != nil {
log.Fatalf("获取 gasFeeCap 失败: %v", err)
}
gasTipCap := big.NewInt(2000000000) // 优先费(2 Gwei)
// 接收方地址 toAddress := common.HexToAddress("0xd3738d783594FC329cf6c2b559314a1c2B0b73C4")
// 创建 EIP-1559 交易
tx := types.NewTx(&types.DynamicFeeTx{
Nonce: nonce,
GasFeeCap: gasFeeCap,
GasTipCap: gasTipCap,
Gas: gasLimit,
To: &toAddress,
Value: value,
Data: nil,
})
// 获取链 ID
chainID, err := client.NetworkID(context.Background())
if err != nil {
log.Fatalf("获取链 ID 失败: %v", err)
}
log.Print(chainID)
// 签名交易
signedTx, err := types.SignTx(tx, types.NewLondonSigner(chainID), privateKey)
if err != nil {
log.Fatalf("签名交易失败: %v", err)
}
// 发送交易
err = client.SendTransaction(context.Background(), signedTx)
if err != nil {
log.Fatalf("发送交易失败: %v", err)
}
fmt.Printf("交易已发送: %s\n", signedTx.Hash().Hex())
}

看看 Ganache 界面上这几个账号有什么变化:
先看交易界面,和代码中交易的数量以及使用的 GAS 也是一致的,说明交易成功。

在【BLOCKS】界面上增加了一个 BLOCK。

也能从各自的账户上发现 ETH 的变化:

最后修改于 2025-09-18