web3.0-区块链 入门指南-慕课网
慕课网 - 程序员的梦工厂
DXing Blog - Life is a fucking movie


第1章 未来已来:Web3.0时代的序幕已经拉开

目前web3.0的蓬勃发展状态解析

什么是web3.0

  • 1998年 蒂姆·伯纳斯·李 首次提出 web3.0
  • Gavin Wood:里程碑式人物
  • web3 foundation(web3基金会)
  • 个人互联网:数据所有权的回归 web3.0
  • 价值互联网:defi、NFT、metaverse(元宇宙)
  • 技术支撑:去中心化技术、包括但不限于区块链

web2.0中的数据主权问题

用户内容 -> 中心化公司手中 -> 丢失 封号 隐私

web3.0:数据主权回归

用户内容 -> 去中心化设施 -> 用户自主

统一的数字身份

  • 登录账号 -> 数字身份
    • web1.0 用户名、密码
    • web2.0 一个账号登录多个平台
    • web3.0 一个钱包登录所有应用

个人互联网:web3.0

带来的变革

  • 基于数据的全球化财富体系
  • 数据主权,跨平台的用户数据库,自主数字身份
  • 全球范围的无摩擦力的现代金融

web3.0发展

美国众院2021听证会

  • coinbase opensea
  • 红衫资本:2022年投资20家web3公司
  • coinbase ventures:4个月投资80家web3

物有必至 事有必然

  • 人类协作方式、生活方式的必然变革
  • 中国不可能失去一个时代
  • 开发者要未雨绸缪

web3.0的应用形态与落地项目案例展示

Defi:Uniswap

  • 资产交换

NFT:OpenSea

  • NFT

GameFi

规则用智能合约表达 -> 道具人物输出为NFT -> NFT进入OpenSea/Defi获得流动性

  • 边玩边赚

SocialFi

文章贴文发布为NFT -> 创作者自身发布为 Creator Coin -> 成为复杂的经济学系统

  • 边写边赚

不仅仅是项目落地

  • NFT:符号主义需求满足
  • Defi:零摩擦力的流动性
  • Metaverse:另一种乌托邦斜事

第2章 web3.0给开发者带来哪些新的机遇与挑战

web2.0开发者的机遇与挑战

挑战

  • 知识结构的更新
  • 与web2.0时代的技术有直接的继承性
  • 自主自治自我激励-DAO

关于web2.0走向web3.0开发技术的更新

本位技能

  • 智能合约开发技术
  • 分布式存储与搜索

背景知识

  • 区块链基础设施
  • 密码学知识:零知识证明,隐私计算

不只是技术,开发观念和方法也在更新

观念和方法

  • 很大程度上web3.0将面临全新的业务模型
  • 对金融与经济学问题的理解将成为开发者的挑战

web3.0 开发学习路线

入行学习

  • 掌握合约开发语言 Solidity
  • 源码阅读(Uniswap),对web3的应用方法论形成基本观念
    • Uniswap
    • Compound
  • 开发工具与环境的使用
    • Remix
    • Hardhat
    • Truffle
    • OpenZeppelin(基础类库)

长期的修养

  • 分析 Defi、NFT、元宇宙应用的结构、模式
  • 跟踪了解 区块链基础设施的演进
  • 形成 经济学和金融知识、常识与洞察

流程图 后期加上图片

第3章 入门体验:开发属于你的第一个Web3.0项目 - ERC20合约

web3.0项目-ERC20合约规范

ERC20规范

  • 同质化token,用于表达同质化资产
  • 是使用最为广泛的标准,没有之一
1
2
3
4
5
6
7
8
9
10
interface IERC20 {
function name( ) external view returns (string memory);
function symbol( ) external view returns (string memory);
function decimals( ) external view returns (uint8);
function balanceOf(address account) external view returns (uint256);
function transfer(address to, uint256 amount) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(address from, address to, uint256 amount) external returns (bool);
}

开发步骤

  • 在线工具 Remix

    熟悉Remix -> 学习一个例子 -> 开发MkErc20 -> 测试 -> 在Metamask操作

ERC20合约项目代码开发-remix功能操作

  • Remix 初始代码 页面/按钮/文件 基本讲解 看视频

ERC20合约项目代码开发-合约基础知识

  • Remix 初始代码 详细讲解默认文件里的代码
  • 详细讲解 /contracts 目录下的文件
    • /contracts/1_Storage.sol
    • /contracts/2_Owner.sol
    • /contracts/3_Ballot.sol

ERC20合约项目代码开发-MkErc20开发

  • 尝试了下简单版本的 erc20 发行以及转账功能
  • 在 Remix 本地网络进行部署测试

ERC20合约项目代码开发-metamask操作erc20

  • 引入 MetaMask 的Sepolia测试网部署 模拟真实场景
  • MkErc20的智能合约在真正投入使用之前还有不少的动作还没开发
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.8.2 <0.9.0;
/**
 * 参考 Solidity 0.8.28 版本文档 和 视频教程 进行的修改补充
 * 0x55AdF98418fA18eCb7D5977C408CA944F9A52c15 Sepolia测试网部署
 */
contract MkErc20{
    // 关键字 "public" 使变量可从其他合约访问
    // 状态变量 代币名称
    string public name = "Muke Token";
    // 状态变量 代币符号
    string public symbol = "MKT";
    // 状态变量 代币小数点
    uint8 public decimals = 4;
    // 状态变量 总计币种数目
    // uint256 public totalAmount = 100 * (10**uint8(decimals)); // 10^6=1000000
    // 状态变量 总发行量
    uint256 public totalSupply;
    // 状态变量 创始人
    address public minter;
    // 公共状态变量 可以使用这个函数查询单个账户的余额
    mapping(address => uint) public balances;
    // 事件允许客户端对你声明的特定合约更改做出反应
    event Sent(address from, address to, uint amount);
    /**
     * 简单的转账功能 任何人都可以调用给任何人转账
     */
    // function transfer(address from, address to, uint256 amount) public returns (bool){
    //     uint256 fromb = balances[from];
    //     uint256 tob = balances[to];
    //     balances[from] = fromb - amount;
    //     balances[to] = tob + amount;
    //     return true;
    // }
    // 构造函数代码仅在合约被创建时运行 通过部署时传入数值确定币种总数量
    // 可以不用传参数
    constructor(uint totalAmount) {
        // 定义创始人minter变量 为当前创建合约者
        minter = msg.sender;
        totalSupply = totalAmount;
        // 给当前创始人发送币量
        balances[msg.sender]= totalAmount;
    }
    // 向地址发送一定数量的新创建的币
    // 只能由合约创建者调用
    // require() 第一个参数是表达式(判断是false 则直接跳过),第二个是回调函数 类似于其他语言的验证
    // require() 执行若出现错误则全部回滚
    function mint(address receiver, uint amount) public {
        require(msg.sender == minter);
        balances[receiver] += amount;
    }
    // 错误允许你提供有关操作失败的原因的信息。
    // 它们被返回给函数的调用者。
    // 余额不足error
    // 定义的参数语义 requested请求数量 available可用数量
    error InsufficientBalance(uint requested, uint available);
    // 从任何调用者向地址发送一定数量的现有币
    function send(address receiver, uint amount) public {
        require(amount <= balances[msg.sender], InsufficientBalance(amount, balances[msg.sender]));
        balances[msg.sender] -= amount;
        balances[receiver] += amount;
        emit Sent(msg.sender, receiver, amount);
    }
    // 转账逻辑
    // 跟上面的 send发送 函数 作用一致
    function transfer(address to, uint256 amount) public returns (bool){
        // 限制 只允许发起合约转账的用户
        address from = msg.sender;
       
        uint256 fromb = balances[from];
        uint256 tob = balances[to];
        balances[from] = fromb - amount;
        balances[to] = tob + amount;
        return true;
    }
}

第4章 课程总结与回顾

课程结语

  • 我们正面临变局,抓住机遇,迎接挑战,未来已来
  • 立足当下,掌握智能合约开发技术,扩展职业空间