区块链入门指南
一、区块链到底是啥?
可以先记一句话:
区块链 = 分布式的、按时间顺序链接起来的、防篡改账本
拆开说
"账本"
- 记录各种数据:转账、交易、合约执行结果等
- 和数据库类似,但更强调记录历史,不随便改旧账
"区块"
- 不是一条条单独的记录,而是很多条记录打包成一个"区块"(Block)
- 每个区块有:
- 区块头:元信息,如时间、前一个区块的哈希、Merkle Root 等
- 区块体:具体交易
"链"
- 每个区块里会存上一个区块的哈希值,像一条铁链一环扣一环
- 一旦前面某个区块被改动,它的哈希会变,后面的全对不上,就会被识别出来
二、为什么"改不了账"?(核心安全机制)
关键点:哈希 + 链式结构 + 分布式共识
1. 哈希函数(Hash)
- 定义:输入任意数据,输出一个固定长度的"指纹"
- 特点:
- 输入稍微变一点,输出就完全变
- 只能正向算,不能从哈希值反推原文(几乎不可能)
- 区块头里会有整个区块的哈希,谁改内容,哈希就变,马上露馅
2. 链式结构
- 每个区块记录上一个区块的哈希
- 改一个区块 = 这个区块哈希变了 = 后面所有区块都要重算
- 在真正的大型链上几乎做不到(算力太大、成本太高)
3. 分布式记账 / 共识机制
- 数据不是存在某一台中央服务器,而是成千上万节点各自保存一份完整账本
- 想"改历史",不仅要算力爆炸,还要控制大多数节点认可你那份假账,难度极高
三、谁在记账?怎么保证大家账本一致?
这里就要讲到节点(Node)和共识机制(Consensus)。
1. 节点
- 全节点:保存完整区块链数据,并参与验证
- 轻节点:只保存部分数据,做简单验证(比如手机钱包)
2. 共识机制做什么?
一句话:一堆互不信任的陌生人,如何就"下一页账本写什么"达成一致?
常见共识机制
(1) 工作量证明 PoW(比特币)
- 机制:节点(矿工)拼命算一个难题,谁先算出来,谁获得记账权 + 奖励(BTC)
- 优点:简单粗暴,安全性高
- 缺点:非常耗电,扩展性差,确认慢
(2) 权益证明 PoS(以太坊现在用)
- 机制:按你质押(Stake)的币数量和时间,抽签决定谁来记账
- 流程:
- 被选中的验证者负责打包区块并广播,其他验证者来确认
- 若作恶(乱记账),会被罚没质押的币
- 优点:节能、速度更快
- 缺点:设计更复杂,有"富者愈富"的争议
💡 还有 DPoS、PBFT 等,偏联盟链/企业应用,这里先不展开。
四、里面的钱和身份是怎么回事?
1. 账户与地址
- 每个人有一对:私钥 & 公钥
- 公钥经过一些算法变成你的地址(address),类似银行账号
- 私钥就像密码 + 签名工具,只能你自己持有,谁拿到谁能花你的钱
2. 数字签名
- 你用私钥对交易进行签名,网络里的节点可以用你的公钥验证:
- 确认"确实是你发的"
- 确认"内容没被改过"
好处:
- 无需用户名/密码/手机号
- 不依赖中心机构发证书(像银行、支付宝那种)
五、智能合约(Smart Contract)
这是公链世界里非常重要的一块,特别是以太坊、Solana 等。
简单理解
- 写在链上的程序,规则一旦部署就很难改
- 满足条件时自动执行,不需要中间人
举几个例子
去中心化交易所(DEX)
- Uniswap 等,用户把币打进合约,合约按算法自动撮合和定价
借贷协议(Aave / Compound)
- 抵押资产,自动借贷,利息由市场决定
NFT 合约
- 定义某个唯一数字资产的所有权、转让规则、版税分成等
六、区块链能干啥?(典型应用)
1. 数字货币(比特币、稳定币等)
- 跨境转账快,不需要银行,任何人都可参与
2. 智能合约 & DeFi(去中心化金融)
- 借贷、交易、衍生品、保险等金融逻辑全部由代码执行
3. NFT & 数字资产确权
- 艺术品、游戏道具、门票、会员权利等,用 NFT 表示"唯一所有权"
4. 供应链溯源
- 食品、药品、奢侈品,把每个环节记录在链上,做到可查、可验证
5. DAO(去中心化自治组织)
- 通过代币投票治理的"网络组织",规则写在合约里,公开透明
七、它的优点 & 问题
优点
- ✅ 防篡改:历史记录基本无法伪造
- ✅ 透明:任何人都可以查看所有交易(在公链上)
- ✅ 去中心化:不依赖单一机构,就算某些节点挂了,整体还能运行
- ✅ 抗审查:只要你能连接到网络,就能发交易、部署合约
问题 / 挑战
- ⚠️ 性能:TPS(每秒交易数)比中心化系统差很多(尤其是早期公链)
- ⚠️ 体验差:私钥丢了就没了;Gas 费;确认时间等
- ⚠️ 监管 & 合规:涉及货币、证券、隐私等问题,各国态度不同
- ⚠️ 能耗问题:PoW 链耗电惊人(比特币常被诟病这一点)
概念层
- 弄清楚:公链 / 私链 / 联盟链、Layer1 / Layer2、DeFi / NFT / DAO 是什么
技术层(如果你会写代码)
学习:
- 以太坊基本结构(账户模型、Gas、EVM)
- Solidity 语法,写简单智能合约(如代币、投票、简单银行)
安全 & 经济设计
了解:
- 常见攻击(重放攻击、重入攻击、闪电贷攻击等)
- 通证经济(Tokenomics)、激励机制设计
动手写你的第一个智能合约
一、我们将要写什么合约?
我们从最经典的入门合约开始:
👉 「一个可以存、取一句话的记事本合约」
功能只有两个:
setMessage(string):写一段话getMessage():读取当前存储的内容
这是所有智能合约的基础结构,简单但能让你完全懂核心概念。
二、环境准备(你只需要浏览器)
我们使用免费的在线 IDE:
👉 打开:https://remix.ethereum.org/
- 无需安装、无需注册
- 进入后你会看到左侧的文件栏、中间是代码窗口、右侧是部署界面
三、复制下面这份最简易智能合约代码
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract SimpleNote {
string public message;
// 写入内容
function setMessage(string memory _msg) public {
message = _msg;
}
// 读取内容
function getMessage() public view returns (string memory) {
return message;
}
}操作步骤:
- 复制上面的代码
- 在 Remix 左边栏点「+」新建文件
- 命名:
SimpleNote.sol - 粘贴进去
四、开始部署(部署 = 把你的合约放到链上)
在右侧点击:
- 左边第四个图标 "Deploy & Run"
- Environment 选择:"Remix VM"(本地虚拟链,不花钱)
- 点击 Deploy
你现在就在一个模拟以太坊"本地链"上部署了一个智能合约。
五、开始交互:读写你的数据
你会看到:
setMessage(输入字符串、点执行)message(不用参数,直接点就能读出)getMessage(返回字符串)
试试:
setMessage→ 输入:Hello Blockchain- 点击
message→ Remix 会显示:Hello Blockchain
你刚刚完成了一个最基本的链上存储和读取操作。
六、你已经掌握了智能合约的核心逻辑
你现在已经知道一个合约包含哪几部分:
- 状态变量(state variable)
- 函数(function)
- 读写数据逻辑
- 部署 & 调用过程
这是所有智能合约的"骨架"。
亲手造一个自己的 ERC20 代币
一、我们要做的代币长什么样?
功能对标 ERC20 标准的"简化版":
- ✅ 有名字:
name - ✅ 有符号:
symbol(比如 USDT、ETH) - ✅ 有精度:
decimals(一般是 18) - ✅ 有总量:
totalSupply - ✅ 查询余额:
balanceOf(address) - ✅ 转账:
transfer - ✅ 授权别人代你转:
approve+transferFrom - ✅ 事件:
Transfer、Approval
⭐ 注意:这是教学版,主网真要发币建议用 OpenZeppelin 的实现。
二、在 Remix 里新建合约文件
- 打开:https://remix.ethereum.org
- 左侧 File Explorer → 点「+」新建文件
- 命名为:
MyToken.sol - 把下面这段代码整段复制进去:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/// @title 一个最简版的 ERC20 代币示例(教学用)
contract MyToken {
// 代币基础信息
string public name = "My Token";
string public symbol = "MTK";
uint8 public decimals = 18;
// 总供应量
uint256 public totalSupply;
// 余额表:每个地址 => 它有多少代币
mapping(address => uint256) public balanceOf;
// 授权额度:owner => (spender => amount)
mapping(address => mapping(address => uint256)) public allowance;
// 事件:转账 & 授权
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
/// @dev 构造函数,部署时一次性把所有币发给部署者
/// @param _initialSupply 不带小数的初始数量,比如 1000000
constructor(uint256 _initialSupply) {
// 按照 decimals 放大,比如 100 * 10^18
totalSupply = _initialSupply * 10 ** uint256(decimals);
// 所有初始代币给部署合约的人
balanceOf[msg.sender] = totalSupply;
emit Transfer(address(0), msg.sender, totalSupply);
}
/// @dev 内部转账逻辑
function _transfer(address _from, address _to, uint256 _value) internal {
require(_to != address(0), "Invalid address");
uint256 fromBalance = balanceOf[_from];
require(fromBalance >= _value, "Not enough balance");
unchecked {
balanceOf[_from] = fromBalance - _value;
}
balanceOf[_to] += _value;
emit Transfer(_from, _to, _value);
}
/// @notice 直接从自己账户转给别人
function transfer(address _to, uint256 _value) public returns (bool) {
_transfer(msg.sender, _to, _value);
return true;
}
/// @notice 授权别人可以花你的币
function approve(address _spender, uint256 _value) public returns (bool) {
allowance[msg.sender][_spender] = _value;
emit Approval(msg.sender, _spender, _value);
return true;
}
/// @notice 在授权额度内,第三方代你转账
function transferFrom(address _from, address _to, uint256 _value) public returns (bool) {
uint256 allowed = allowance[_from][msg.sender];
require(allowed >= _value, "Allowance exceeded");
// 扣减授权额度
allowance[_from][msg.sender] = allowed - _value;
_transfer(_from, _to, _value);
return true;
}
}三、编译合约
- 左侧点第二个图标 Solidity 编译器(形状像个小"勾勾")
- 版本选
0.8.x(和pragma solidity ^0.8.0;兼容即可) - 点击 Compile MyToken.sol
- 如果没有红色报错,说明编译 OK
四、部署你的代币
- 左侧点第四个图标 Deploy & Run Transactions
- Environment 选:Remix VM(虚拟链,免费玩)
- Contract 下拉选择:MyToken
- 下面 Constructor 的参数框里,填你想要的初始发行量,例如:
1000000(一百万)- 真正链上数量 = 1000000 × 10^18(因为 decimals = 18)
- 点 Deploy
- 部署成功后,下面会出现一个 MyToken 实例
五、开始玩你的代币 🎮
在下面 "Deployed Contracts" 区域找到你的 MyToken 实例,展开可以看到:
name→ 点一下会返回 "My Token"symbol→ 返回 "MTK"decimals→ 返回 18totalSupply→ 返回一个很长的数字(已经乘了 10^18)
1️⃣ 查看你的余额
- 点
balanceOf,在输入框里填你当前的地址(右上角 ACCOUNT 显示的那个) - 点击
balanceOf按钮 → 会返回你持有的数量(单位是最小单位,已乘 10^18)
2️⃣ 转账给别人
- 右上角 ACCOUNT 保持是部署者地址(有所有币的那个)
- 展开
transfer:_to:填另一个地址(可以在 ACCOUNT 下拉里切一个,复制粘贴)_value:填要转的数量(同样是最小单位,比如 1 个币 = 1 × 10^18)
- 点 transact
- 然后:
- 切换 ACCOUNT 到收款地址
- 调用
balanceOf(收款地址)→ 就能看到新余额了
💡 如果你嫌每次都手动乘 10^18,可以先简单按照"整数当成最小单位"来玩,不管小数,比如就当做"代币有 18 位小数的分"。
六、approve / transferFrom 授权玩法(理解 DeFi 的关键)
这是 ERC20 里最重要的一组函数,所有 DEX、合约都靠它拿你的授权。
场景:
- A(你)授权 B,可以帮你转最多 100 × 10^18 个币
- 之后 B 调
transferFrom(A, C, amount),把 A 的币转给 C
在 Remix 里这样测:
- ACCOUNT 选 A(有很多币的地址)
- 调
approve:_spender:填 B 的地址_value:比如100000000000000000000(100 × 10^18)
- 换 ACCOUNT 为 B
- 调
transferFrom:_from:A 地址_to:C 地址(再换一个账户)_value:比如50000000000000000000(50 × 10^18)
- 看看:
balanceOf(A)减少balanceOf(C)增加- 再看
allowance(A, B),从 100 × 10^18 变成 50 × 10^18
你就刚刚手动演示了"授权 + 代扣"流程,这在 DeFi 里出现频率非常高。
七、真实项目上应该怎么写 ERC20?
上面是学习版。真正上主网推荐用 OpenZeppelin 的标准库,优点:
- ✅ 安全审计过
- ✅ 社区广泛使用
- ✅ 额外有 ERC20Burnable、Ownable、Pausable 等扩展
典型结构大概是:
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
contract MyToken is ERC20 {
constructor(uint256 _initialSupply) ERC20("My Token", "MTK") {
_mint(msg.sender, _initialSupply * 10 ** decimals());
}
}💡 路径在 Remix 里可以用 OpenZeppelin 官方教程里的地址,这里先给你概念,等你想上测试网或主网时我再手把手给你配。
常见问题 FAQ
Q1: 私钥丢了怎么办?
答:无法找回。这是去中心化的代价。
建议:
- 使用硬件钱包(如 Ledger、Trezor)
- 助记词抄写在纸上,分多处保存
- 不要截图、不要存云盘、不要发给任何人
Q2: Gas 费是什么?为什么这么贵?
答:Gas 是执行交易或合约需要支付给矿工/验证者的费用。
影响因素:
- 网络拥堵程度(越堵越贵)
- 交易复杂度(合约调用比简单转账贵)
- 你设置的 Gas Price(出价高优先打包)
省钱技巧:
- 选择网络不忙的时候操作(如凌晨)
- 使用 Layer2(如 Arbitrum、Optimism)
- 批量操作而不是多次小额转账
Q3: 测试网和主网有什么区别?
| 特性 | 测试网 | 主网 |
|---|---|---|
| 代币价值 | 无价值(免费领取) | 真金白银 |
| 用途 | 开发测试 | 正式运行 |
| 风险 | 无风险 | 有风险 |
| 速度 | 可能不稳定 | 相对稳定 |
常用测试网:
- 以太坊:Sepolia、Goerli
- BSC:BSC Testnet
- Polygon:Mumbai
Q4: 如何获取测试币?
方法:
水龙头(Faucet):
- Sepolia Faucet: https://sepoliafaucet.com/
- Goerli Faucet: https://goerlifaucet.com/
社交媒体:
- 在 Twitter 发推 @ 官方账号
- 加入 Discord 社区申请
开发者计划:
- Alchemy、Infura 等提供开发者测试币
Q5: 什么是 Gas Limit 和 Gas Price?
- Gas Limit:你愿意为这笔交易支付的最大 Gas 数量
- 设太低:交易失败,Gas 费还是会扣
- 设太高:多余的会退回,但会锁定资金
- Gas Price:每单位 Gas 的价格(通常用 Gwei 表示)
- 1 Gwei = 0.000000001 ETH
- 设高了优先打包,设低了可能等很久
总费用 = Gas Used × Gas Price
Q6: 什么是 Nonce?
定义:账户发出的交易序号,从 0 开始递增。
作用:
- 防止重放攻击
- 保证交易顺序
注意:
- Nonce 必须连续,不能跳过
- 如果 Nonce 5 卡住了,后面的 6、7、8 都会等待
实用工具推荐
钱包
浏览器插件钱包
- MetaMask:最流行的以太坊钱包
- Rabby:多链钱包,UI 更友好
- Phantom:Solana 生态首选
移动端钱包
- imToken:支持多链,中文友好
- Trust Wallet:币安官方钱包
- TokenPocket:功能全面
硬件钱包(最安全)
- Ledger:法国品牌,支持多币种
- Trezor:开源硬件钱包
- OneKey:国产硬件钱包
区块链浏览器
- 以太坊:https://etherscan.io/
- BSC:https://bscscan.com/
- Polygon:https://polygonscan.com/
- Arbitrum:https://arbiscan.io/
用途:
- 查询交易状态
- 查看合约代码
- 监控地址余额
- 查看 Gas 费历史
开发工具
在线 IDE
- Remix:https://remix.ethereum.org/
- ChainIDE:https://chainide.com/
本地开发框架
- Hardhat:现代化开发环境
- Foundry:Rust 编写,速度快
- Truffle:老牌框架(逐渐被 Hardhat 取代)
节点服务
- Alchemy:免费额度大,API 友好
- Infura:老牌服务商
- QuickNode:多链支持
DeFi 工具
- Uniswap:去中心化交易所
- Aave:借贷协议
- Curve:稳定币交易
- 1inch:聚合交易,找最优价格
数据分析
- DeFiLlama:DeFi 数据聚合
- Dune Analytics:链上数据分析
- Nansen:巨鲸追踪(付费)
安全注意事项 ⚠️
私钥安全
❌ 绝对不要做的事:
- 不要截图助记词
- 不要存在云盘、邮箱
- 不要发给任何人(包括"客服")
- 不要在联网电脑上明文保存
✅ 应该做的事:
- 手写在纸上,分多处保存
- 使用硬件钱包
- 使用密码管理器(如 1Password)加密保存
- 定期检查备份是否完好
合约交互安全
授权(Approve)风险
当你在 DEX 交易时,会要求你授权合约使用你的代币。
风险:
- 恶意合约可能把你授权的代币全部转走
- 即使交易完成,授权仍然有效
防护:
- 只授权需要的数量,不要授权无限额度
- 交易完成后撤销授权
- 使用 https://revoke.cash/ 定期检查并撤销授权
常见骗局
假币骗局
- 骗子发行和知名代币同名的假币
- 防护:交易前核对合约地址
钓鱼网站
- 伪造官方网站,诱导连接钱包
- 防护:仔细检查域名,使用书签
空投骗局
- 钱包里突然出现不明代币
- 卖出时需要授权,实际是盗取资产
- 防护:不要随便卖出不明代币
假客服
- 冒充官方客服,索要私钥或助记词
- 防护:记住,真正的客服永远不会要私钥
交易安全检查清单
在确认交易前,检查:
- ✅ 合约地址是否正确
- ✅ 接收地址是否正确
- ✅ 金额是否正确
- ✅ Gas 费是否合理
- ✅ 网络是否正确(主网/测试网)
学习资源推荐
官方文档
- 以太坊官方文档:https://ethereum.org/zh/developers/docs/
- Solidity 文档:https://docs.soliditylang.org/
- OpenZeppelin 文档:https://docs.openzeppelin.com/
在线课程
免费课程
- CryptoZombies:https://cryptozombies.io/zh/
- 游戏化学习 Solidity
- 适合零基础
- Ethereum.org 教程
- 官方出品,质量高
- Alchemy University
- 免费的 Web3 开发课程
付费课程
- Udemy:搜索 "Solidity" 或 "Blockchain"
- Coursera:区块链专项课程
- 极客时间:中文区块链课程
社区
中文社区
- 登链社区:https://learnblockchain.cn/
- 以太坊爱好者:公众号
- Rebase 社区:Web3 开发者社区
英文社区
- Reddit:r/ethereum, r/ethdev
- Discord:各项目官方 Discord
- Twitter:关注 Vitalik、项目官方账号
推荐书籍
《精通以太坊》(Mastering Ethereum)
- 作者:Andreas M. Antonopoulos
- 适合:有编程基础的开发者
《区块链技术指南》
- 适合:理解底层原理
《Solidity 编程实战》
- 适合:智能合约开发
YouTube 频道
- Dapp University:英文,质量高
- Eat The Blocks:实战项目教学
- Patrick Collins:Solidity 和 Foundry
进阶主题
Layer 2 解决方案
为什么需要 Layer 2?
- 以太坊主网(Layer 1)速度慢、费用高
- Layer 2 在主网之上构建,继承安全性但提升性能
主流 Layer 2:
Rollup 类
- Optimistic Rollup:Optimism、Arbitrum
- 乐观假设交易有效,有争议期
- ZK Rollup:zkSync、StarkNet
- 零知识证明,更安全但技术复杂
侧链
- Polygon:独立共识,兼容 EVM
- BSC:币安智能链
跨链桥
作用:在不同区块链之间转移资产
常用跨链桥:
- Stargate:LayerZero 生态
- Hop Protocol:Layer 2 之间跨链
- Multichain:多链支持
风险:
- 跨链桥是黑客攻击的重灾区
- 只使用知名、审计过的桥
- 不要转移大额资产
MEV(矿工可提取价值)
定义:矿工/验证者通过重排、插入、审查交易获得的额外收益
常见 MEV 策略:
- 抢跑(Front-running):看到你的交易,抢先执行
- 夹子攻击(Sandwich Attack):在你的交易前后各插入一笔
- 套利:利用不同 DEX 的价格差
防护:
- 使用 Flashbots 等私有交易池
- 设置合理的滑点保护
- 避免在链上暴露交易意图
智能合约安全
常见漏洞:
重入攻击(Reentrancy)
- 著名案例:The DAO 事件
- 防护:使用 Checks-Effects-Interactions 模式
整数溢出
- Solidity 0.8.0 之前需要手动检查
- 现在编译器自动检查
访问控制
- 函数可见性设置错误
- 防护:使用 OpenZeppelin 的 Ownable、AccessControl
闪电贷攻击
- 利用闪电贷操纵价格
- 防护:使用时间加权平均价格(TWAP)
审计工具:
- Slither:静态分析工具
- Mythril:安全分析
- Echidna:模糊测试
实战项目建议
初级项目
简单代币
- 实现 ERC20 标准
- 添加铸造、销毁功能
投票合约
- 创建提案
- 投票和统计
简单 NFT
- 实现 ERC721
- 元数据存储
中级项目
众筹合约
- 设定目标金额
- 达标后释放资金
- 未达标退款
拍卖合约
- 英式拍卖
- 荷兰式拍卖
简单 DEX
- 自动做市商(AMM)
- 流动性池
高级项目
借贷协议
- 抵押借贷
- 利率模型
- 清算机制
DAO 治理
- 提案系统
- 投票权重
- 时间锁
跨链桥
- 资产锁定和铸造
- 跨链消息传递
总结
区块链技术正在快速发展,这份指南只是一个起点。
学习建议:
- 动手实践:光看不练假把式,一定要自己写代码
- 阅读源码:看优秀项目的代码,学习最佳实践
- 关注安全:安全永远是第一位的
- 持续学习:技术更新快,保持学习习惯
- 加入社区:和其他开发者交流,共同成长
下一步行动:
- ✅ 完成第一个智能合约
- ✅ 部署到测试网
- ✅ 学习一个 DeFi 协议的源码
- ✅ 参与开源项目
- ✅ 关注安全审计报告
祝你在 Web3 的世界里探索愉快!🚀