Fadey's Blog

arrow_back返回首页
Web3区块链

Web3入门:区块链开发实战指南

Web3代表了互联网的下一代——一个去中心化、用户拥有数据所有权的网络。本文将从区块链基础概念出发,带你完成从智能合约编写到DApp部署的完整流程。

一、什么是Web3?

Web3是基于区块链技术的去中心化互联网愿景:

  • Web1.0(1990-2004):只读网页,用户是信息的消费者
  • Web2.0(2004-至今):可读可写,平台拥有数据,用户生成内容
  • Web3.0(未来):可读可写可拥有,用户通过钱包控制身份和资产

核心特征:无需许可(任何人可参与)、抗审查(没有中心化控制)、原生支付(内置加密货币)。

二、区块链基础

区块链是一个分布式账本,关键特性:

区块链 = 去中心化 + 不可篡改 + 透明可验证 + 共识机制

核心概念

  • 区块(Block):包含交易记录、时间戳、前一区块哈希的数据结构
  • 共识机制:PoW(工作量证明,比特币)、PoS(权益证明,以太坊2.0)
  • Gas:执行交易的计算费用,防止网络滥用
  • 钱包:管理私钥和公钥的工具,私钥=资产控制权
// 区块结构示意
struct Block {
    index: u64,
    timestamp: u64,
    transactions: Vec<Transaction>,
    previous_hash: String,
    nonce: u64,
    hash: String,
}

三、智能合约

智能合约是部署在区块链上的自动执行程序,满足条件即触发执行:

// 智能合约伪代码
contract Escrow {
    address buyer;
    address seller;
    uint256 amount;
    bool released;

    function confirmDelivery() public {
        require(msg.sender == buyer, "Only buyer");
        require(!released, "Already released");
        released = true;
        payable(seller).transfer(amount);
    }
}

智能合约的特点:一旦部署无法修改(除非预留升级机制)、所有操作透明、执行结果确定。

四、Solidity基础

Solidity是以太坊上最流行的智能合约语言,语法类似JavaScript:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

contract MyToken {
    string public name;
    string public symbol;
    uint256 public totalSupply;
    mapping(address => uint256) public balanceOf;

    event Transfer(address indexed from, address indexed to, uint256 value);

    constructor(string memory _name, string memory _symbol, uint256 _supply) {
        name = _name;
        symbol = _symbol;
        totalSupply = _supply;
        balanceOf[msg.sender] = _supply;
    }

    function transfer(address to, uint256 amount) public returns (bool) {
        require(balanceOf[msg.sender] >= amount, "Insufficient balance");
        balanceOf[msg.sender] -= amount;
        balanceOf[to] += amount;
        emit Transfer(msg.sender, to, amount);
        return true;
    }
}

Solidity核心概念

  • 数据类型:uint256, int256, bool, address, string, bytes, mapping
  • 可见性:public(外部可调用)、internal(合约内)、private(仅合约内)
  • 修饰符:view(只读)、pure(无状态)、payable(可接收ETH)
  • 事件:Event,用于记录链上日志,前端可监听

五、以太坊与EVM

EVM(以太坊虚拟机)是智能合约的运行环境:

特性说明
图灵完备理论上可执行任何计算
确定性相同输入始终产生相同输出
隔离执行合约无法访问其他合约的私有状态
Gas限制防止无限循环,必须在gas耗尽前完成

EVM兼容链(EVM-Compatible)如BSC、Polygon、Arbitrum等,可以复用以太坊的开发工具和合约代码。

六、Hardhat开发环境

Hardhat是最流行的以太坊开发框架:

# 初始化项目
mkdir my-dapp && cd my-dapp
npm init -y
npm install --save-dev hardhat @nomicfoundation/hardhat-toolbox
npx hardhat init

hardhat.config.js配置示例:

require("@nomicfoundation/hardhat-toolbox");

module.exports = {
    solidity: "0.8.20",
    networks: {
        sepolia: {
            url: process.env.SEPOLIA_RPC_URL,
            accounts: [process.env.PRIVATE_KEY],
        },
    },
};

常用Hardhat命令:

  • npx hardhat compile — 编译合约
  • npx hardhat test — 运行测试
  • npx hardhat node — 启动本地节点
  • npx hardhat run scripts/deploy.js — 部署合约

七、部署ERC-20代币

使用OpenZeppelin库快速创建标准代币:

npm install @openzeppelin/contracts
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";

contract FadeyToken is ERC20, Ownable {
    constructor() ERC20("Fadey Token", "FTK") Ownable(msg.sender) {
        _mint(msg.sender, 1_000_000 * 10 ** decimals());
    }

    function mint(address to, uint256 amount) public onlyOwner {
        _mint(to, amount);
    }
}

部署脚本 scripts/deploy.js:

const hre = require("hardhat");

async function main() {
    const Token = await hre.ethers.getContractFactory("FadeyToken");
    const token = await Token.deploy();
    await token.waitForDeployment();
    console.log("FadeyToken deployed to:", await token.getAddress());
}

main().catch((error) => {
    console.error(error);
    process.exitCode = 1;
});

八、NFT基础

NFT(非同质化代币)是独一无二的数字资产,使用ERC-721标准:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
import "@openzeppelin/contracts/access/Ownable.sol";

contract MyNFT is ERC721, ERC721URIStorage, Ownable {
    uint256 private _tokenIdCounter;

    constructor() ERC721("MyNFT", "MNFT") Ownable(msg.sender) {}

    function mintNFT(address recipient, string memory tokenURI)
        public onlyOwner returns (uint256)
    {
        uint256 tokenId = _tokenIdCounter;
        _tokenIdCounter++;
        _mint(recipient, tokenId);
        _setTokenURI(tokenId, tokenURI);
        return tokenId;
    }
}

九、DeFi简介

DeFi(去中心化金融)是Web3最重要的应用方向:

  • DEX(去中心化交易所):Uniswap,基于AMM(自动做市商)模型
  • 借贷协议:Aave、Compound,超额抵押借贷
  • 稳定币:DAI、USDC,与法币挂钩的加密货币
  • 流动性挖矿:提供流动性获取奖励

一个简单的AMM合约核心逻辑:

function swap(uint amountIn, address tokenIn, address tokenOut) public {
    uint reserveIn = balanceOf[tokenIn][address(this)];
    uint reserveOut = balanceOf[tokenOut][address(this)];
    uint amountOut = (amountIn * 997 * reserveOut) / (reserveIn * 1000 + amountIn * 997);
    // 执行交换...
}

总结

Web3开发涉及密码学、经济学和软件工程的交叉领域。建议从部署测试网合约开始,逐步深入协议层面。推荐资源:CryptoZombies(游戏化学习)、Solidity官方文档、OpenZeppelin文档。