以太坊快速入门
以太坊快速入门
欢迎来到以太坊开发世界!本文将帮助你快速了解以太坊的基础概念,并搭建开发环境,写出并部署你的第一个智能合约。
以太坊是什么
以太坊是一个去中心化的开源区块链平台,支持图灵完备的智能合约。它由 Vitalik Buterin 于 2013 年提出,2015 年正式上线。
区块链并没有我们想象的无所不能。虽然通过共识实现了去中心化、不可篡改等特性,但同时它也是一个重复计算、冗余存储的分布式系统。这样一个系统,显然不是无所不能的,但在特定场景下,特别是与金融相结合,区块链有着无可替代的价值。
以太坊的核心组成
- 以太币(ETH):以太坊的原生货币,用于支付 Gas 费用
- 智能合约:部署在以太坊上的程序,按预设规则自动执行
- 去中心化应用(DApp):基于智能合约的应用程序
- EVM(以太坊虚拟机):执行智能合约的运行环境
- 节点网络:全球数千个节点共同维护区块链状态
以太坊 vs 传统应用
| 特性 | 传统应用 | 以太坊 DApp |
|---|---|---|
| 数据存储 | 中心化服务器 | 去中心化区块链 |
| 代码控制 | 公司可随时修改 | 部署后不可更改 |
| 停机风险 | 服务器宕机 | 全球节点,极难宕机 |
| 资金托管 | 平台托管 | 用户自我托管 |
| 访问门槛 | 可被封锁 | 无需许可 |
以太坊生态概览
Layer 1(主网)
以太坊主网是基础层,所有交易的最终结算都在这里进行。
- 目前采用**权益证明(PoS)**共识机制(2022 年合并后)
- 平均出块时间:12 秒
- 每秒交易数(TPS):约 15-30 笔
Layer 2(扩容方案)
在以太坊上构建的第二层网络,提供更高 TPS 和更低 Gas 费:
| L2 网络 | 类型 | 特点 |
|---|---|---|
| Arbitrum | Optimistic Rollup | 最大 TVL |
| Optimism | Optimistic Rollup | OP Stack 生态 |
| Base | Optimistic Rollup | Coinbase 开发 |
| zkSync Era | ZK Rollup | 零知识证明 |
| Polygon | 侧链+zkEVM | 多链方案 |
DeFi 生态
- Uniswap:最大去中心化交易所(AMM)
- Aave:去中心化借贷协议
- MakerDAO:DAI 稳定币发行方
- Curve:稳定币交换专家
NFT 生态
- OpenSea:最大 NFT 交易市场
- Blur:专业交易者平台
- CryptoPunks、BAYC:蓝筹 NFT 项目
准备工作
1. 安装 MetaMask 钱包
MetaMask 是最流行的以太坊钱包,以浏览器扩展形式存在。
- 访问 metamask.io 安装浏览器扩展
- 创建新钱包,妥善保存助记词(12 或 24 个单词)
- 助记词是找回钱包的唯一方式,切勿泄露给任何人
重要安全提示:
- 永远不要在任何网页上输入助记词
- 永远不要截屏保存助记词
- 正规项目绝不会要求你提供助记词
2. 获取测试网 ETH
在测试网上练习,不需要花费真实资金:
Sepolia 测试网水龙头:- https://sepoliafaucet.com/- https://www.alchemy.com/faucets/ethereum-sepolia- https://faucet.quicknode.com/ethereum/sepolia在 MetaMask 中切换到 Sepolia 测试网,然后到水龙头申请测试 ETH。
3. 安装开发工具
Node.js
# 访问 https://nodejs.org 下载安装node --version # 验证安装,推荐 v18+npm --version安装 Hardhat(推荐入门使用)
mkdir my-ethereum-project && cd my-ethereum-projectnpm init -ynpm install --save-dev hardhatnpx hardhat init或者使用 Foundry(高性能选择)
curl -L https://foundry.paradigm.xyz | bashfoundryupforge --versioncast --versionanvil --versionRemix IDE(无需安装,在线使用)
访问 remix.ethereum.org,直接在浏览器中编写、编译和部署合约,非常适合初学者。
你的第一个智能合约
使用 Remix IDE(最简单方式)
- 打开 remix.ethereum.org
- 在
contracts文件夹创建HelloWorld.sol - 输入以下代码:
// SPDX-License-Identifier: MITpragma solidity ^0.8.0;
contract HelloWorld { string public message;
constructor(string memory _message) { message = _message; }
function setMessage(string memory _newMessage) public { message = _newMessage; }
function getMessage() public view returns (string memory) { return message; }}- 按 Ctrl+S 编译
- 在 Deploy 页面,选择 “Injected Provider - MetaMask”
- 输入初始消息参数,部署到 Sepolia 测试网
使用 Hardhat 开发
初始化项目:
mkdir hello-ethereum && cd hello-ethereumnpm init -ynpm install --save-dev hardhat @nomicfoundation/hardhat-toolboxnpx hardhat init # 选择 "Create a JavaScript project"创建合约文件:
// SPDX-License-Identifier: MITpragma solidity ^0.8.24;
contract HelloWorld { string public message;
event MessageChanged(string oldMessage, string newMessage);
constructor(string memory _initialMessage) { message = _initialMessage; }
function setMessage(string memory _newMessage) public { emit MessageChanged(message, _newMessage); message = _newMessage; }}编写测试:
const { expect } = require("chai");const { ethers } = require("hardhat");
describe("HelloWorld", function () { let helloWorld;
beforeEach(async function () { const HelloWorld = await ethers.getContractFactory("HelloWorld"); helloWorld = await HelloWorld.deploy("Hello, World!"); await helloWorld.waitForDeployment(); });
it("应该返回初始消息", async function () { expect(await helloWorld.message()).to.equal("Hello, World!"); });
it("应该成功更新消息", async function () { await helloWorld.setMessage("Hello, Ethereum!"); expect(await helloWorld.message()).to.equal("Hello, Ethereum!"); });
it("应该发出 MessageChanged 事件", async function () { await expect(helloWorld.setMessage("新消息")) .to.emit(helloWorld, "MessageChanged") .withArgs("Hello, World!", "新消息"); });});运行测试:
npx hardhat test部署脚本:
const { ethers } = require("hardhat");
async function main() { const [deployer] = await ethers.getSigners(); console.log("部署账户:", deployer.address);
const HelloWorld = await ethers.getContractFactory("HelloWorld"); const helloWorld = await HelloWorld.deploy("Hello, Ethereum!"); await helloWorld.waitForDeployment();
console.log("合约地址:", await helloWorld.getAddress());}
main().then(() => process.exit(0)).catch(console.error);配置并部署到 Sepolia:
require("@nomicfoundation/hardhat-toolbox");require("dotenv").config();
module.exports = { solidity: "0.8.24", networks: { sepolia: { url: process.env.SEPOLIA_RPC_URL, accounts: [process.env.PRIVATE_KEY] } }};# .env 文件SEPOLIA_RPC_URL=https://sepolia.infura.io/v3/YOUR_KEYPRIVATE_KEY=0x你的测试账户私钥
# 部署npx hardhat run scripts/deploy.js --network sepolia与合约交互
使用 ethers.js
const { ethers } = require("ethers");require("dotenv").config();
const ABI = [ "function message() view returns (string)", "function setMessage(string memory _newMessage)", "event MessageChanged(string oldMessage, string newMessage)"];
async function main() { const provider = new ethers.JsonRpcProvider(process.env.SEPOLIA_RPC_URL); const wallet = new ethers.Wallet(process.env.PRIVATE_KEY, provider); const contract = new ethers.Contract("0x合约地址", ABI, wallet);
// 读取消息 const message = await contract.message(); console.log("当前消息:", message);
// 更新消息 const tx = await contract.setMessage("来自 Node.js 的问候!"); await tx.wait(); console.log("更新成功,交易:", tx.hash);
// 读取新消息 console.log("新消息:", await contract.message());}
main();使用 React + wagmi(前端 DApp)
import { useReadContract, useWriteContract } from 'wagmi';
const CONTRACT_ABI = [...] as const;
function HelloDApp() { const { data: message } = useReadContract({ address: '0x合约地址', abi: CONTRACT_ABI, functionName: 'message', });
const { writeContract, isPending } = useWriteContract();
return ( <div> <p>当前消息: {message}</p> <button onClick={() => writeContract({ address: '0x合约地址', abi: CONTRACT_ABI, functionName: 'setMessage', args: ['Hello from React!'], })} disabled={isPending} > {isPending ? '处理中...' : '更新消息'} </button> </div> );}推荐学习路径
第一阶段:基础入门(1-2 周)
- 理解区块链基本概念(区块、交易、Gas)
- 在 Remix 上写简单 Solidity 合约
- 部署到 Sepolia 测试网并验证
推荐资源:
- CryptoZombies - 游戏化学习 Solidity
- Solidity 官方文档
第二阶段:开发工具(2-4 周)
- 掌握 Hardhat 或 Foundry
- 编写完整的单元测试
- Gas 优化和安全实践
第三阶段:标准合约(4-6 周)
- ERC20 代币合约
- ERC721 NFT 合约
- OpenZeppelin 合约库使用
第四阶段:全栈 DApp(6-8 周)
- ethers.js / wagmi 前端集成
- 完整 DApp 项目
- 部署到主网或 Layer2
常用工具和资源
开发工具
| 工具 | 用途 | 链接 |
|---|---|---|
| Remix IDE | 在线开发环境 | remix.ethereum.org |
| Hardhat | 开发框架 | hardhat.org |
| Foundry | 高性能开发框架 | getfoundry.sh |
| Tenderly | 合约调试监控 | tenderly.co |
区块链浏览器
| 网络 | 浏览器 |
|---|---|
| 以太坊主网 | etherscan.io |
| Sepolia 测试网 | sepolia.etherscan.io |
| Arbitrum | arbiscan.io |
| Optimism | optimistic.etherscan.io |
中文学习资源
- 登链社区 - 中文区块链技术社区,大量优质教程
- OpenBuild - Web3 开发者成长平台
- WTF Academy - 简短有趣的 Solidity 教程
RPC 节点服务
| 服务 | 免费额度 | 特点 |
|---|---|---|
| Infura | 每天 10 万请求 | 老牌服务商 |
| Alchemy | 每月 3 亿算力单位 | 功能丰富 |
| QuickNode | 按需使用 | 低延迟 |
以太坊生态的局限性与发展
当前的区块链结构并没有我们想象的无所不能。虽然通过共识实现了去中心化、不可篡改等特性,但同时也是一个重复计算、冗余存储的分布式系统。这样一个系统,显然有很多的局限:
- 计算受限:由于共识机制带来的计算瓶颈,处理计算问题的能力比不上中心化系统
- 存储昂贵:账本全体备份造成资源浪费,链上存储成本极高
- 外部数据困难:区块链是封闭系统,直接获取链下数据(如价格)需要预言机解决
- 交易吞吐有限:主网约 15-30 TPS,Layer2 正在解决这个问题
不过有个好消息:区块链与金融是完美匹配,而金融是现代经济的核心。 通过 DeFi、NFT、DAO 等应用,以太坊正在重塑金融基础设施。
总结
以太坊开发入门要点:
- 理解基础:区块链、账户、Gas、智能合约、EVM
- 搭建环境:MetaMask 钱包 + Node.js + Hardhat 或 Foundry
- 学习 Solidity:从 HelloWorld 开始,逐步深入
- 测试先行:在 Sepolia 测试网验证,再考虑主网
- 前端集成:用 wagmi/ethers.js 构建完整 DApp
- 安全意识:了解常见漏洞,使用 OpenZeppelin 安全库
以太坊生态发展迅速,社区活跃。加入社区、动手实践,你将进入一个充满可能性的去中心化世界!
下一步学习:
- 以太坊核心概念 - 深入理解账户、交易、EVM
- Solidity 基础语法 - 智能合约编程语言
- Hardhat 开发环境 - 专业开发框架
- Layer2 扩容方案 - 低成本高速交易