## 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() -