说明
讲师:首席架构师 李智慧
区块链
带着问题上课:
- 为什么是比特币造就了区块链技术?
- 区块链技术用什么办法,解决了什么问题?
- 区块链技术有什么用?
货币起源
- 贝壳里面的体系很快就崩溃了。因为住山上的人,贝壳很少,但是住海边的人,很容易得到贝壳。
- 黄金和白银天生就是永恒的货币。因为它稀缺,不容易损坏。但是黄金和白银不便于携带。
- 纸质货币,最早是中国宋朝发明的(钱庄的银票)。靠政府的信用做担保。
通货膨胀
- 左边为津巴布韦币,50万亿。
- 右边为民国时期,发工资的情况。用麻袋发工资。
美联储 2020 年已经印了3万亿美金,已经流通在美国。通货膨胀还在不断的发生。
比特币出现,就是解决货币不能由政府说了算,而是有计算机算法和机制说了算。
数字货币的挑战
数字货币的发行不是问题,问题是如何保证数字货币安全,获得信任。
- 如何相信数字货币是有价值的,即发行安全。
- 如何相信货币交易是安全的。
比特币的解决方案
- 构建一个无中心、去信任的交易系统。
- 《比特币:一个点对点的电子现金系统》
交易
记账者可以使用发起者的公钥对签名进行验证,保证交易是真正发起者提交的,而不是其他人伪造的交易。
区块链
将交易放入区块,将区块构成单向链表,即区块链,以避免双花。
工作量证明
比特币要求计算出来的区块 Hash 值必须具有一定的难度,比如 Hash 值的前几位必须是0. 具体做法是在区块头部引入一个随机数 nonce 值,记账者通过修改这个 nonce 值,不断碰撞计算区块 Hash 值,直到算出的 Hash 值满足难度要求。
工作量证明可以极大增加区块链伪造的成本,除非发动 51% 攻击。
矿工
比特币系统为每个计算出区块 Hash 的记账者赠送一定数量的比特币。这个赠送不是交易,而是凭空从系统中产生的,这其实就是比特币的发行机制。
当 “矿工们” 为了争夺比特币,争相加入 “挖矿” 大军时,比特币区块链就变成一个分布式账本了。
矿工为比特币的发行支付了对价,某种程度保证了比特币的价值。
以太坊(Ethereum)
下一代智能合约和去中心化应用平台。
Ethereum 是一个平台和一种编程语言,使开发人员能够建立和发布下一代分布式应用。Ethereum 可以用来编程,分散,担保和交易任何事物:投票,域名,金融交易所,众筹,公司管理,合同和大部分的协议,知识产权,还有得益于硬件集成的智能资产。
十分钟发行自己的数字货币
contract TokenERC20 {
string public symbol;
unit256 public totalSupply;
mapping (address => uint256) public balanceOf;
function _transfer(address _from, address _to, uint _value) internal {
balanceOf[_from] -= _value;
balanceOf[_to] += _value;
}
}
Facebook 的数字货币 Libra
- Libra 是一种稳定币;
- Libra 是一种许可型区块链。
联盟链技术 HyperLedger
IBM 发布的 联盟链技术 HyperLedger。
解决的问题:多家银行之间交易,账本记录在哪里?
现在是美国的Swift系统为全球中心结算心痛。全球银行都必须加入美国的Swift系统,没有加入不是全球金融系统。2020年,最近美国要把香港银行踢出美国的Swift系统,如果踢出了美国的Swift系统,香港就不再是全球金融中心了。
联盟链技术 Tairuem
https://github.com/taireum/go-taireum
- 兼容以太坊生态体系
- 更安全的区块链网络通信协议
- 更高效的记账共识算法
- 更易用的运维管理工具
以太坊应用于企业级开发存在的问题
在准入机制上,使用以太坊构建的区块链网络允许任何节点接入,也意味着区块数据是完全公开的,而大多数企业级的应用场景则要求仅联盟成员接入网络,非成员拒绝入网,并且数据也仅供联盟成员访问,对非联盟成员保密。
在共识算法上,以太坊使用工作量证明 (PoW)的方式对区块打包进行算力证明,除非恶意节点获取了以太坊整个网络 51% 的计算能力,否则无法篡改伪造区块数据,保证区块数据安全可靠。但是工作量证明需要花费巨大的计算资源进行算力证明,造成算力极大浪费,也影响了区块链的交易吞吐能力。联盟链场景下,由于各个参与节点是经过联盟认证的,背后有实体组织背书,所以在区块打包的时候不需要进行工作量证明,大大减少算力浪费,提高交易吞吐能力。
在区块链运维管理上,以太坊作为公有链,节点之间通过 P2P 协议自动组网,无需运维管理。而联盟链需要对联盟成员进行管理,对哪些节点可被授权打包区块也需要进行管理,以保证联盟链的有效运行。
Taireum 重构以太坊
重构了以太坊的 P2P 网络通信模块,使其需要进行安全验证得到联盟许可可能加入新节点进入当前联盟链网络。
重构了以太坊的共识算法,只有经过联盟成员认证授权的节点才能打包区块,打包节点按序轮流打包,无需算力证明。
开发了联盟共识控制台 CCC(Consortium Consensus Console),方便对联盟链进行运维管理,联盟链用户只需要在 Web Console 上就可以安装部署联盟链节点,投票选举新的联盟成员和区块授权打包节点。
Taireum 技术架构
Taireum 复用了以太坊的智能合约模块,并对共识算法和网络通信模块进行了重构改造,重新开发了联盟共识控制台,从而使其适用于企业级联盟链应用场景。
Taireum 联盟共识控制台
联盟共识控制台是 Taireum 为联盟链运维管理开发的 web 组件,企业可以使用联盟共识控制台方便地部署联盟链运行节点,管理联盟成员和授权节点打包区块。每个参与联盟链的企业节点都部署自己独立的联盟共识控制台,出于安全目的,每个企业节点的联盟共识控制台彼此独立,互不感知,他们通过调用联盟共识智能合约对联盟管理事务进行协商,以达成共识。
contract CCC {
//初始化合约,传入联盟创建者信息
//联盟创建者将成为联盟第一个成员和第一个拥有打包区块权限的节点
function CCC(String _companyname, String _email, string _remark, string _enode) public { }
//联盟新成员申请
function applyMember(String _companyname, String _email, string _remark, string _enode, address _account) public {}
//投票成为联盟成员
function VoteMember(unit _fromcompanyid, uint _tocompanyid) public {}
//投票授权打包区块,前提必须已经是联盟成员
function VoteMine(unit _fromcompanyid, uint _tocompanyid) public {}
}
联盟共识智能合约是 Taireum 联盟链的宪法
联盟链创立者节点的联盟共识控制台第一次部署成功联盟共识智能合约的时候,将该合约的地址发给共识算法模块,共识算法在封装区块头的时候将合约地址写入区块头的 miner 中。
即使联盟成员节点部署的联盟控制台彼此独立互不通信,只需要获得区块链,就能得到联盟共识智能合约地址。
Taireum 区块头
- miner 中记录联盟共识智能合约地址;
- extraData 记录经过椭圆曲线加密的区块打包者地址信息,其它节点通过解密得到打包节点地址并验证该地址是否有权限打包节点。
- nonce 记录一个 magic code “0xcaffffffffffff”, 表示该区块获得了共识合约地址并写入当前区块(其它区块 nonce magic code 为 “0xcaffffffffffff”)。
- Difficulty 当前打包者是否为合法顺序打包者。
Taireum 联盟新成员许可入网
Taireum 重构了以太坊的 P2P 通信模块,只有在许可列表中的节点才允许和当前联盟成员节点建立连接,其它的连接请求在通信层就会拒绝,保证联盟链的安全和私密性。
许可列表即 Taireum 成员列表,通过前述的联盟共识智能合约管理。P2P 通信模块通过联盟共识控制台调用智能合约,获得联盟成员列表,检查连接请求是否合法。
Taireum 联盟新成员许可入网流程:
- 新成员下载 Taireum,启动联盟共识控制台,然后在联盟共识控制台启动 Taireum 节点,获得节点 enode url。
- 将 enode url 及其它公司信息提交给当前联盟链某个成员,该成员通过联盟共识智能合约发起新成员入网申请。
- 联盟其它成员通过智能合约对新成员入网申请进行投票,得票数符合约定后,新成员信息被记入成员列表。
- 新成员节点通过网络连接当前联盟链成员节点,当前成员节点 P2P 通信模块读取智能合约成员列表信息,检查新成员节点 enode url 在成员列表中,同意建立连接,新成员节点开始下载区块数据。
Taireum 记账共识算法
Tce 共识算法引擎,对联盟投票选出的授权打包节点排序,轮流进行区块打包。
- 联盟成员公国联盟共识智能合约投票选举授权打包区块的节点(在合约创建的时候,创建者,即联盟链创始人默认拥有打包区块的权限)。
- Tce 共识算法通过联盟共识控制台访问智能合约,获得授权打包区块的节点地址列表,并排序。
- 检查父区块头的 extraData,解密取出父区块的打包者签名,查看该签名是否在授权打包节点地址列表里,如果不在就返回错误。
- 根据当前区块的块高(block number),对授权打包区块的节点地址列表长度取模,根据余数决定对当前区块进行打包的节点,如果当前节点,就进行区块打包,并把区块头难度系数设为2, 如果非当前节点,随机等待一段时间后打包区块,并把区块头难度系数设为1. 尽量使当前节点打包的区块被加入区块链,同时又保证当前打包节点失效的情况下,其他节点也会完成区块打包工作。
Taireum 在 P2P 资产共享联盟中的应用设想
Tairuem 区块链在酒店班车的应用搜索
Tairuem 区块链在酒店分销平台的应用设想
创新小案例
首席架构师 李智慧,之前做过的开源项目。
一个电影搜索引擎案例
一般搜索引擎都是根据题目搜索。比如电影、图书、音乐、旅游。
创新点在于:根据搜索电影内容得到结果。
源码:
应用:
https://github.com/itisaid/sokeeper
爬虫、倒排索引构建:
https://github.com/itisaid/cmdb
汉语处理组件包(汉语分词)
https://github.com/hankcs/HanLP