开始进行交易一笔
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