Skip to content

区块链入门指南

一、区块链到底是啥?

可以先记一句话:

区块链 = 分布式的、按时间顺序链接起来的、防篡改账本

拆开说

"账本"

  • 记录各种数据:转账、交易、合约执行结果等
  • 和数据库类似,但更强调记录历史,不随便改旧账

"区块"

  • 不是一条条单独的记录,而是很多条记录打包成一个"区块"(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/

  • 无需安装、无需注册
  • 进入后你会看到左侧的文件栏、中间是代码窗口、右侧是部署界面

三、复制下面这份最简易智能合约代码

solidity
// 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;
    }
}

操作步骤

  1. 复制上面的代码
  2. 在 Remix 左边栏点「+」新建文件
  3. 命名:SimpleNote.sol
  4. 粘贴进去

四、开始部署(部署 = 把你的合约放到链上)

在右侧点击:

  1. 左边第四个图标 "Deploy & Run"
  2. Environment 选择:"Remix VM"(本地虚拟链,不花钱)
  3. 点击 Deploy

你现在就在一个模拟以太坊"本地链"上部署了一个智能合约。

五、开始交互:读写你的数据

你会看到:

  • setMessage(输入字符串、点执行)
  • message(不用参数,直接点就能读出)
  • getMessage(返回字符串)

试试

  1. setMessage → 输入:Hello Blockchain
  2. 点击 message → Remix 会显示:Hello Blockchain

你刚刚完成了一个最基本的链上存储和读取操作。

六、你已经掌握了智能合约的核心逻辑

你现在已经知道一个合约包含哪几部分:

  • 状态变量(state variable)
  • 函数(function)
  • 读写数据逻辑
  • 部署 & 调用过程

这是所有智能合约的"骨架"。


亲手造一个自己的 ERC20 代币

一、我们要做的代币长什么样?

功能对标 ERC20 标准的"简化版":

  • ✅ 有名字:name
  • ✅ 有符号:symbol(比如 USDT、ETH)
  • ✅ 有精度:decimals(一般是 18)
  • ✅ 有总量:totalSupply
  • ✅ 查询余额:balanceOf(address)
  • ✅ 转账:transfer
  • ✅ 授权别人代你转:approve + transferFrom
  • ✅ 事件:TransferApproval

注意:这是教学版,主网真要发币建议用 OpenZeppelin 的实现。

二、在 Remix 里新建合约文件

  1. 打开:https://remix.ethereum.org
  2. 左侧 File Explorer → 点「+」新建文件
  3. 命名为:MyToken.sol
  4. 把下面这段代码整段复制进去:
solidity
// 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;
    }
}

三、编译合约

  1. 左侧点第二个图标 Solidity 编译器(形状像个小"勾勾")
  2. 版本选 0.8.x(和 pragma solidity ^0.8.0; 兼容即可)
  3. 点击 Compile MyToken.sol
  4. 如果没有红色报错,说明编译 OK

四、部署你的代币

  1. 左侧点第四个图标 Deploy & Run Transactions
  2. Environment 选:Remix VM(虚拟链,免费玩)
  3. Contract 下拉选择:MyToken
  4. 下面 Constructor 的参数框里,填你想要的初始发行量,例如:1000000(一百万)
    • 真正链上数量 = 1000000 × 10^18(因为 decimals = 18)
  5. Deploy
  6. 部署成功后,下面会出现一个 MyToken 实例

五、开始玩你的代币 🎮

在下面 "Deployed Contracts" 区域找到你的 MyToken 实例,展开可以看到:

  • name → 点一下会返回 "My Token"
  • symbol → 返回 "MTK"
  • decimals → 返回 18
  • totalSupply → 返回一个很长的数字(已经乘了 10^18)

1️⃣ 查看你的余额

  1. balanceOf,在输入框里填你当前的地址(右上角 ACCOUNT 显示的那个)
  2. 点击 balanceOf 按钮 → 会返回你持有的数量(单位是最小单位,已乘 10^18)

2️⃣ 转账给别人

  1. 右上角 ACCOUNT 保持是部署者地址(有所有币的那个)
  2. 展开 transfer
    • _to:填另一个地址(可以在 ACCOUNT 下拉里切一个,复制粘贴)
    • _value:填要转的数量(同样是最小单位,比如 1 个币 = 1 × 10^18)
  3. transact
  4. 然后:
    • 切换 ACCOUNT 到收款地址
    • 调用 balanceOf(收款地址) → 就能看到新余额了

💡 如果你嫌每次都手动乘 10^18,可以先简单按照"整数当成最小单位"来玩,不管小数,比如就当做"代币有 18 位小数的分"。

六、approve / transferFrom 授权玩法(理解 DeFi 的关键)

这是 ERC20 里最重要的一组函数,所有 DEX、合约都靠它拿你的授权。

场景

  • A(你)授权 B,可以帮你转最多 100 × 10^18 个币
  • 之后 B 调 transferFrom(A, C, amount),把 A 的币转给 C

在 Remix 里这样测

  1. ACCOUNT 选 A(有很多币的地址)
  2. approve
    • _spender:填 B 的地址
    • _value:比如 100000000000000000000(100 × 10^18)
  3. 换 ACCOUNT 为 B
  4. transferFrom
    • _from:A 地址
    • _to:C 地址(再换一个账户)
    • _value:比如 50000000000000000000(50 × 10^18)
  5. 看看:
    • balanceOf(A) 减少
    • balanceOf(C) 增加
    • 再看 allowance(A, B),从 100 × 10^18 变成 50 × 10^18

你就刚刚手动演示了"授权 + 代扣"流程,这在 DeFi 里出现频率非常高。

七、真实项目上应该怎么写 ERC20?

上面是学习版。真正上主网推荐用 OpenZeppelin 的标准库,优点:

  • ✅ 安全审计过
  • ✅ 社区广泛使用
  • ✅ 额外有 ERC20Burnable、Ownable、Pausable 等扩展

典型结构大概是:

solidity
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: 如何获取测试币?

方法

  1. 水龙头(Faucet)

  2. 社交媒体

    • 在 Twitter 发推 @ 官方账号
    • 加入 Discord 社区申请
  3. 开发者计划

    • 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:国产硬件钱包

区块链浏览器

用途

  • 查询交易状态
  • 查看合约代码
  • 监控地址余额
  • 查看 Gas 费历史

开发工具

在线 IDE

本地开发框架

  • Hardhat:现代化开发环境
  • Foundry:Rust 编写,速度快
  • Truffle:老牌框架(逐渐被 Hardhat 取代)

节点服务

  • Alchemy:免费额度大,API 友好
  • Infura:老牌服务商
  • QuickNode:多链支持

DeFi 工具

  • Uniswap:去中心化交易所
  • Aave:借贷协议
  • Curve:稳定币交易
  • 1inch:聚合交易,找最优价格

数据分析

  • DeFiLlama:DeFi 数据聚合
  • Dune Analytics:链上数据分析
  • Nansen:巨鲸追踪(付费)

安全注意事项 ⚠️

私钥安全

绝对不要做的事

  • 不要截图助记词
  • 不要存在云盘、邮箱
  • 不要发给任何人(包括"客服")
  • 不要在联网电脑上明文保存

应该做的事

  • 手写在纸上,分多处保存
  • 使用硬件钱包
  • 使用密码管理器(如 1Password)加密保存
  • 定期检查备份是否完好

合约交互安全

授权(Approve)风险

当你在 DEX 交易时,会要求你授权合约使用你的代币。

风险

  • 恶意合约可能把你授权的代币全部转走
  • 即使交易完成,授权仍然有效

防护

  1. 只授权需要的数量,不要授权无限额度
  2. 交易完成后撤销授权
  3. 使用 https://revoke.cash/ 定期检查并撤销授权

常见骗局

  1. 假币骗局

    • 骗子发行和知名代币同名的假币
    • 防护:交易前核对合约地址
  2. 钓鱼网站

    • 伪造官方网站,诱导连接钱包
    • 防护:仔细检查域名,使用书签
  3. 空投骗局

    • 钱包里突然出现不明代币
    • 卖出时需要授权,实际是盗取资产
    • 防护:不要随便卖出不明代币
  4. 假客服

    • 冒充官方客服,索要私钥或助记词
    • 防护:记住,真正的客服永远不会要私钥

交易安全检查清单

在确认交易前,检查:

  • ✅ 合约地址是否正确
  • ✅ 接收地址是否正确
  • ✅ 金额是否正确
  • ✅ Gas 费是否合理
  • ✅ 网络是否正确(主网/测试网)

学习资源推荐

官方文档

在线课程

免费课程

  • CryptoZombieshttps://cryptozombies.io/zh/
    • 游戏化学习 Solidity
    • 适合零基础
  • Ethereum.org 教程
    • 官方出品,质量高
  • Alchemy University
    • 免费的 Web3 开发课程

付费课程

  • Udemy:搜索 "Solidity" 或 "Blockchain"
  • Coursera:区块链专项课程
  • 极客时间:中文区块链课程

社区

中文社区

英文社区

  • Reddit:r/ethereum, r/ethdev
  • Discord:各项目官方 Discord
  • Twitter:关注 Vitalik、项目官方账号

推荐书籍

  1. 《精通以太坊》(Mastering Ethereum)

    • 作者:Andreas M. Antonopoulos
    • 适合:有编程基础的开发者
  2. 《区块链技术指南》

    • 适合:理解底层原理
  3. 《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 等私有交易池
  • 设置合理的滑点保护
  • 避免在链上暴露交易意图

智能合约安全

常见漏洞

  1. 重入攻击(Reentrancy)

    • 著名案例:The DAO 事件
    • 防护:使用 Checks-Effects-Interactions 模式
  2. 整数溢出

    • Solidity 0.8.0 之前需要手动检查
    • 现在编译器自动检查
  3. 访问控制

    • 函数可见性设置错误
    • 防护:使用 OpenZeppelin 的 Ownable、AccessControl
  4. 闪电贷攻击

    • 利用闪电贷操纵价格
    • 防护:使用时间加权平均价格(TWAP)

审计工具

  • Slither:静态分析工具
  • Mythril:安全分析
  • Echidna:模糊测试

实战项目建议

初级项目

  1. 简单代币

    • 实现 ERC20 标准
    • 添加铸造、销毁功能
  2. 投票合约

    • 创建提案
    • 投票和统计
  3. 简单 NFT

    • 实现 ERC721
    • 元数据存储

中级项目

  1. 众筹合约

    • 设定目标金额
    • 达标后释放资金
    • 未达标退款
  2. 拍卖合约

    • 英式拍卖
    • 荷兰式拍卖
  3. 简单 DEX

    • 自动做市商(AMM)
    • 流动性池

高级项目

  1. 借贷协议

    • 抵押借贷
    • 利率模型
    • 清算机制
  2. DAO 治理

    • 提案系统
    • 投票权重
    • 时间锁
  3. 跨链桥

    • 资产锁定和铸造
    • 跨链消息传递

总结

区块链技术正在快速发展,这份指南只是一个起点。

学习建议

  1. 动手实践:光看不练假把式,一定要自己写代码
  2. 阅读源码:看优秀项目的代码,学习最佳实践
  3. 关注安全:安全永远是第一位的
  4. 持续学习:技术更新快,保持学习习惯
  5. 加入社区:和其他开发者交流,共同成长

下一步行动

  • ✅ 完成第一个智能合约
  • ✅ 部署到测试网
  • ✅ 学习一个 DeFi 协议的源码
  • ✅ 参与开源项目
  • ✅ 关注安全审计报告

祝你在 Web3 的世界里探索愉快!🚀