|
|
## 1. 区块链技术的核心概念和原理
|
|
|
- 密码朋克 (Cypher punk)
|
|
|
- 维基解密的创始人 阿桑奇
|
|
|
- BT下载的作者 布莱姆-科恩
|
|
|
- WWW 的发明者 蒂姆博纳斯-李
|
|
|
- 智能合约概念的提出者: 尼克萨博
|
|
|
- Facebook 创始人: 肖恩帕克
|
|
|
- 中本聪
|
|
|
|
|
|
- Adam Back 发明了 Hash cash, 使用了 POW
|
|
|
- Haber/ Stornetta 提出时间戳方法保证数字文件安全的协议
|
|
|
- 戴维 发明了 B-money, 强调了点对点交易和不可更改记录
|
|
|
- 哈尔-芬尼 推出了 "加密现金"
|
|
|
- 2008 年中本聪 《比特币: 一个点对点的电子现金系统》
|
|
|
|
|
|
- 区块链技术前景
|
|
|
- 应用场景
|
|
|
- 资产:数字资产发行, 支付(跨境支付), 交易, 结算
|
|
|
- 记账:股权交易, 供应链金融, 商业积分
|
|
|
- 不可篡改:溯源, 众筹, 医疗证明, 存在性证明
|
|
|
- 点对点:共享经济, 物联网
|
|
|
- 隐私: 匿名交易
|
|
|
|
|
|
- 什么是货币?
|
|
|
- 凯恩斯《货币论》货币是可以承载价值的一般等价物
|
|
|
|
|
|
- 货币历史
|
|
|
- 铜币, 金银 -> 银票 -> 法币 -> 数字货币(一串数字)
|
|
|
|
|
|
- 信任从何而来
|
|
|
- 财产只受自己控制
|
|
|
- 无通胀(总量不变得)
|
|
|
- 没有假钞
|
|
|
- 流通性好
|
|
|
|
|
|
- 比特币是什么
|
|
|
- 去中心化的记账系统
|
|
|
|
|
|
- 比特币的原理
|
|
|
- 账本如何验证?
|
|
|
- 所有权问题?
|
|
|
- 为什么记账?(挖矿)
|
|
|
- 以谁的账本为准?(共识机制)
|
|
|
|
|
|
- Hash
|
|
|
- 哈希函数: Hash(原始信息) = 摘要信息
|
|
|
- 特点:
|
|
|
- 同样的原始信息用同一个哈希函数总能得到相同的摘要信息
|
|
|
- 原始信息任何微小的变化都会哈希出面目全非的摘要信息
|
|
|
- 从摘要信息无法逆向推算出原始信息
|
|
|
|
|
|
- 非对称加密技术(交易签名)
|
|
|
- 交易进行hash得到摘要
|
|
|
- 用私钥对摘要进行签名
|
|
|
|
|
|
- 所有权问题? 广播交易
|
|
|
- 签名及验证
|
|
|
|
|
|
- 为什么记账?
|
|
|
- 记账: Hash 打包过程
|
|
|
- 消耗资源
|
|
|
- 奖励 -> 比特币发行
|
|
|
|
|
|
- 挖矿 - 工作量证明
|
|
|
- 规则: 一段时间内只有一人可以记账成功
|
|
|
- 通过解决密码学的难题(即工作量证明)竞争获得唯一记账权
|
|
|
- 其他的节点复制记账结果
|
|
|
|
|
|
- 工作量证明
|
|
|
- Hash(上一个Hash值, 交易记录集) = 456635BCD
|
|
|
- Hash(上一个Hash值, 交易记录集, 随机数) = 0000aFD635BCD
|
|
|
|
|
|
- 交易记录集
|
|
|
- 收集广播中还没有被记录账本的交易
|
|
|
- 交易的有效性验证
|
|
|
- 添加一笔给自己转账的交易(挖矿奖励)
|
|
|
|
|
|
- 共识机制
|
|
|
- 两个节点同时完成工作量证明, 使用谁的区块?
|
|
|
- 无仲裁机构裁决
|
|
|
- 为什么要遵守协议?
|
|
|
- 节点的工作量只有在其他节点认可认同其是有效地
|
|
|
- 累计工作量最大的区块链
|
|
|
- 独立
|
|
|
- 延长最长链
|
|
|
|
|
|
## 2. 区块链的原理实现 (Python3)
|
|
|
|
|
|
- python, pip, pipenv, Flask/requests
|
|
|
|
|
|
```shell
|
|
|
# 安装运行的环境
|
|
|
pip install pipenv
|
|
|
# 安装 python 的运行环境 -> 生成 Pipfile
|
|
|
pipenv --python=python3.6
|
|
|
# 安装需要的依赖
|
|
|
pipenv install flask==0.12.2
|
|
|
pipenv install requests==2.18.4
|
|
|
```
|
|
|
|
|
|
### 2.1 区块链的实现代码
|
|
|
- demo/blockchain.py
|
|
|
|
|
|
|
|
|
## 3. 以太坊
|
|
|
|
|
|
- 比特币的局限性
|
|
|
- 2013 Vitalik Buterin 发表了以太坊白皮书
|
|
|
|
|
|
- 以太坊描述及特点
|
|
|
- 去中心化应用平台
|
|
|
- 区块链 2.0
|
|
|
- 可编程(操作系统)
|
|
|
- 智能合约, EVM
|
|
|
- 约每 15 秒出块, 挖矿奖励3ETH, 叔块奖励
|
|
|
- 无总量限制(比特币总共有2100万枚)
|
|
|
|
|
|
### 3.1 核心概念-智能合约
|
|
|
- 以太坊上的程序, 是代码和数据(状态)的集合
|
|
|
- 准图灵完备
|
|
|
- 典型应用: 代币: EOS, 游戏: 迷恋猫
|
|
|
|
|
|
- 编程语言: Solidity
|
|
|
- 类 JavaScript语言 .sol
|
|
|
```solidity
|
|
|
contract HelloWorld{
|
|
|
function hello() public returns(string){
|
|
|
return "Hello World";
|
|
|
}
|
|
|
}
|
|
|
```
|
|
|
|
|
|
- IDE : Remix
|
|
|
- https://remix.ethereum.org
|
|
|
|
|
|
- 运行环境: EVM
|
|
|
- Solidity -> EVM
|
|
|
- Java -> JVM
|
|
|
|
|
|
|
|
|
### 3.2 核心概念-账户
|
|
|
|
|
|
- 账户
|
|
|
- 地址(Address): 20字节
|
|
|
- 状态(State)
|
|
|
|
|
|
- 账户分类
|
|
|
- 外部账户(EOA)
|
|
|
- 合约账户
|
|
|
- 消息由于外部账户发布, 合约的账户不能主动发起交易, 只能通过外部触发
|
|
|
|
|
|
### 3.3 核心概念-钱包
|
|
|
|
|
|
- 钱包(理解为一个开发者工具)
|
|
|
- Geth, Mist, MetaMask
|
|
|
|
|
|
```shell
|
|
|
# 启动终端
|
|
|
geth --datadir testNet --dev console 2>> test.log
|
|
|
# 查看账号信息
|
|
|
eth
|
|
|
# 列出账号的一些信息
|
|
|
personal.listAccounts
|
|
|
# todo 各种 API, 自行进行查看即可
|
|
|
```
|
|
|
|
|
|
### 3.4 核心概念- 交易手续费 Gas
|
|
|
|
|
|
- 费用: Gas价格(用以太币计价) * Gas 数量
|
|
|
- Gas 可以限制工作量, 从账户进行付费, 矿工进行获取
|
|
|
|
|
|
- 以太币单位
|
|
|
- 最小单位: 1Wei(伟)
|
|
|
- 10^9 Wei = 1 Gwei
|
|
|
- 10^12 Wei = 1szabo(萨博)
|
|
|
- 10^15 Wei = 1 finey(芬尼)
|
|
|
- 10^18 Wei = 1 Ether
|
|
|
|
|
|
### 3.4 核心概念- 以太坊网络
|
|
|
|
|
|
- 主网, 测试网络, 私有链, 模拟环境
|
|
|
|
|
|
|
|
|
- 区块链分类
|
|
|
- 公有链, 联盟链, 私有链
|
|
|
|
|
|
|
|
|
## 4. 去中心化应用
|
|
|
|
|
|
- 传统互联网应用
|
|
|
- 中心化, 容易更新, 数据完全掌控
|
|
|
|
|
|
- 去中心化应用
|
|
|
- 去中心化, 按规则运行
|
|
|
|
|
|
- 去中心化 Dapp
|
|
|
- 应用层
|
|
|
- 前端 : APP, H5/CSS
|
|
|
- 后端 : 节点, 存储
|
|
|
- 智能合约
|
|
|
|
|
|
- 去中心化应用案例
|
|
|
- 预测平台: Augur
|
|
|
- 谜恋猫: https://www.cryptokitties.co/
|
|
|
- 百度莱茨, 网易招财猫, 小米加密兔
|
|
|
|
|
|
## 5. 智能合约编程语言-solidity
|
|
|
|
|
|
- 合约文件的结构
|
|
|
- 版本声明
|
|
|
- import
|
|
|
- 合约
|
|
|
- 状态变量
|
|
|
- 函数
|
|
|
- 结构类型
|
|
|
- 事件
|
|
|
- 函数修改器
|
|
|
- 代码注释
|
|
|
|
|
|
- Solidity 语言的类型
|
|
|
- 值类型(Value Type)
|
|
|
- 引用类型(Reference Types)
|
|
|
- https://docs.soliditylang.org/en/v0.4.23/types.html
|
|
|
|
|
|
|
|
|
- 常用值类型
|
|
|
- 布尔类型(Booleans)
|
|
|
- 取值 true/false
|
|
|
- 运算符 ! && || == !=
|
|
|
- 整型(Integers)
|
|
|
- int/uint
|
|
|
- 关键字 unit8 到 uint256(以8步进)
|
|
|
- 位运算符 & | ^ ``
|
|
|
- 算术运算 + - * / % ** << >>
|
|
|
- 右移 等价于 除法去除以2的几次方
|
|
|
- 常量(literals)
|
|
|
- 有理数和整型常量
|
|
|
- 有理数的常量计算不会有溢出的
|
|
|
- 字符串常量
|
|
|
- 十六进制常量
|
|
|
- 地址常量
|
|
|
- 地址合法性检查
|
|
|
- 地址类型(Address)
|
|
|
- address: 表示一个账户地址(20个字节)
|
|
|
- 成员: 属性 balance, 函数 transfer()
|
|
|
|
|
|
- 引用类型
|
|
|
- 数据位置(Data location)
|
|
|
- memory, storage
|
|
|
- 数组类型
|
|
|
- 数组(Arrays)
|
|
|
- T[k]: 元素类型为T, 固定长度为k的数组
|
|
|
- T[]: 元素类型为T, 长度动态调整
|
|
|
- bytes string 是一种特殊的数组
|
|
|
- string 可转为 bytes, bytes 类似 byte[]
|
|
|
- 数组类型
|
|
|
- 属性:length
|
|
|
- 函数: push()
|
|
|
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|