TypeScript 实现 ETH 转账完整指南

·

本文介绍如何使用 TypeScript 和 ethers.js 库在以太坊测试网络上执行 ETH 转账操作,涵盖地址生成、交易构建和区块链确认等关键环节。

准备工作

开始编码前,请确保满足以下条件:

本文演示用例中使用的账户信息:

环境配置与依赖安装

首先创建 TypeScript 项目并安装必要依赖:

npm init -y
npm install ethers typescript ts-node

创建 tsconfig.json 文件配置 TypeScript 编译器:

{
  "compilerOptions": {
    "target": "ES2020",
    "module": "commonjs",
    "esModuleInterop": true,
    "strict": true
  }
}

生成以太坊地址

创建 generateAddress.ts 文件实现地址生成功能:

import { ethers } from 'ethers';

function generateEthereumAddress() {
  const wallet = ethers.Wallet.createRandom();
  return {
    address: wallet.address,
    privateKey: wallet.privateKey
  };
}

const newAddress = generateEthereumAddress();
console.log(`地址(公钥): ${newAddress.address}`);
console.log(`私钥: ${newAddress.privateKey}`);

运行生成脚本:

npx ts-node generateAddress.ts

输出示例:

地址(公钥): 0x0~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
私钥: 0x~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

实现 ETH 转账功能

创建 transfer.ts 文件实现转账逻辑:

import { ethers } from "ethers";

// 配置发送方私钥和接收方地址
const senderPrivateKey = '发送方钱包私钥'; // 替换为钱包A的私钥
const recipientAddress = '接收方钱包地址'; // 替换为钱包B的地址

// 连接 Sepolia 测试网络
const sepoliaProvider = new ethers.JsonRpcProvider('https://rpc.sepolia.org');

async function sendEth() {
  // 初始化钱包实例
  const wallet = new ethers.Wallet(senderPrivateKey, sepoliaProvider);

  // 构建交易对象
  const tx = {
    to: recipientAddress,
    value: ethers.parseEther("0.05") // 转账金额:0.05 ETH
  };

  // 发送交易
  const txResponse = await wallet.sendTransaction(tx);
  console.log('交易哈希:', txResponse.hash);

  // 等待交易确认
  const receipt = await txResponse.wait();
  console.log('交易详情:', receipt);
}

sendEth();

运行转账脚本:

npx ts-node transfer.ts

成功输出示例:

交易哈希: 0xcfd4dbbb05f0424a97bf1db963c1d42b65dbbd3c930881a64e2c0e7dbe297447
交易详情: TransactionReceipt {
  provider: JsonRpcProvider {},
  to: '0xc20e03E025C3F40772f9bDc0F9BeD896fB5E3dCA',
  from: '0x47FD9A30F48a656D9062aDE956c65f0ec8e2186c',
  contractAddress: null,
  hash: '0xcfd4dbbb05f0424a97bf1db963c1d42b65dbbd3c930881a64e2c0e7dbe297447',
  index: 71,
  blockHash: '0x4962365fc9a4f9211e8bfa0ad13a8b6139de3b589ff4fbe53e77b5b09428970b',
  blockNumber: 5000125,
  gasUsed: 21000n,
  status: 1
}

区块链交易验证

交易状态确认

通过交易哈希可在区块链浏览器上查询交易详情:

余额变化验证

钱包A余额变化

钱包B余额变化

手续费分析

实际扣除金额(0.050022385329932 ETH)大于转账金额(0.05 ETH),差额部分为网络手续费。手续费包含以下组成部分:

👉 查看实时 Gas 费用追踪工具

最佳实践与安全建议

私钥安全管理

  1. 环境变量存储: 使用 process.env 管理敏感信息
  2. 硬件钱包集成: 生产环境建议使用硬件钱包解决方案
  3. 多重签名机制: 大额转账建议采用多签合约

交易优化策略

  1. Gas 价格预测: 动态调整 Gas 价格以降低成本
  2. 交易监控: 实现交易状态实时监控机制
  3. 错误处理: 添加完整的异常处理逻辑
// 增强版错误处理示例
async function sendEthWithRetry() {
  try {
    const txResponse = await wallet.sendTransaction(tx);
    const receipt = await txResponse.wait();
    
    if (receipt.status === 1) {
      console.log('交易成功');
    } else {
      console.log('交易失败');
    }
  } catch (error) {
    console.error('交易异常:', error);
  }
}

常见问题

如何获取测试网 ETH?

Sepolia 测试网可通过官方水龙头获取测试 ETH:

交易为什么需要等待确认?

区块链网络需要时间达成共识:

交易失败常见原因有哪些?

如何估算合理的 Gas 费用?

主网与测试网开发有何区别?

如何监控交易状态?

通过本文介绍的完整流程,你已掌握使用 TypeScript 进行 ETH 转账的核心技能。在实际应用中,建议进一步完善错误处理、气体优化和状态监控等功能,以确保应用的稳定性和用户体验。