区块链
2020-05-18 11:49:59 2 举报
AI智能生成
区块链简单易懂学习架构
作者其他创作
大纲/内容
行业发展
巨变行业
数字银行
去中心化金融(DeFi),可能成为银行实现完全数字化的一个催化剂。
2001年以来已经有500多家银行破产,数万亿美元被印制出来以挽救即将垂死的美元,2008年那场危机席卷了整个世界。加密货币正是诞生于那个时候,是专门为解决银行破产而设计的。
供应链
供应链一直是积极拥抱区块链的最大领域之一。区块链经过精心设计,在商品记录和跟踪方面提供了前所未有的高效率。IBM等大型企业很快意识到了这一点,利用区块链进行货物追踪。
健身、MedTech和可穿戴设备
可穿戴技术正在成为引领健康生活方式的一个重要技术,从追踪步数、监控心跳到卡路里摄入。而随着疫情爆发,这一情况也有了新的变化。
资产管理
Yubo Ruan是一位23岁的风险投资家,他自有的基金筹集了6000万美元。他表示:“最大型的资产管理公司在工程应用——包括基础设施和后端服务器——进行了大量投资。但是,如果我们看一下某些区块链相关技术,例如复合协议,会发现成本结构更为简单,回报率(~1%)高于国库券(~0.21%),而且基础设施是建立在成熟技术之上,对人们免费开放,无需花费任何构建或者维护成本。”
Ruan补充说:“从实用性角度来说,这意味着ETF和抵押支持证券之类的金融产品,可以在区块链平台上以较低的成本进行整合。此外,基于区块链的资产管理平台,往往对投资要求的最低余额较低,这对采用区块链是一个重大利好。”
Ruan补充说:“从实用性角度来说,这意味着ETF和抵押支持证券之类的金融产品,可以在区块链平台上以较低的成本进行整合。此外,基于区块链的资产管理平台,往往对投资要求的最低余额较低,这对采用区块链是一个重大利好。”
可信认证
招聘需求
1. 计算机、通信、电子、信息相关专业硕士及以上学历,3年以上工作经验;
2. 精通Java或Go等开发语言,熟悉Linux开发环境
3. 较强的算法能力,刷过至少100道算法题。
4. 熟悉关系数据库系统Oracle,MySQL,熟悉常用的SQL性能优化,熟悉读写
分离以及分布式数据库设计
5. 了解区块链中涉及的加密算法、共识机制、智能合约等技术以及区块链的主流技术框架者优先
6. 熟悉常规的系统性能调优,有高并发、高性能的分布式系统设计经验
2. 精通Java或Go等开发语言,熟悉Linux开发环境
3. 较强的算法能力,刷过至少100道算法题。
4. 熟悉关系数据库系统Oracle,MySQL,熟悉常用的SQL性能优化,熟悉读写
分离以及分布式数据库设计
5. 了解区块链中涉及的加密算法、共识机制、智能合约等技术以及区块链的主流技术框架者优先
6. 熟悉常规的系统性能调优,有高并发、高性能的分布式系统设计经验
1、在分布式系统、加密算法等方面有丰富的经验
2、熟悉至少一个区块链开源项目,例如Hyperledger、Ethereum等
3、有较强的沟通能力,和强烈的自我驱动意识,能够独自承担压力
4、5年以上工作经验,2年以区块链领域的工作经验,有一定的管理能力
5、有良好的英文沟通能力者优先
2、熟悉至少一个区块链开源项目,例如Hyperledger、Ethereum等
3、有较强的沟通能力,和强烈的自我驱动意识,能够独自承担压力
4、5年以上工作经验,2年以区块链领域的工作经验,有一定的管理能力
5、有良好的英文沟通能力者优先
趣链底层研发工程师(区块链)
岗位职责:
1、负责区块链业务的系统分析与设计工作,开发基于联盟链平台架构设计和核心代码开发;
2、在特定的业务场景下,搭建区块链的基础架构(包括后端协议、基础架构、系统服务、共识机制和算法及其相关客户端),开发和完善基于区块链的服务产品;
3、优秀的你甚至可能成为一位全方位的区块链技术人才,跟进区块链相关的最前沿的技术方向
岗位要求
1. 对区块链技术有浓厚兴趣;
2. 本科及以上学历,计算机、软件工程、数学或信息技术相关专业;
3. 熟练掌握Golang、Java、C/C++中至少一种主流编程语言,具有良好的编程能力和编程习惯;
4. 熟悉各种数据结构和算法,对密码学,安全协议和加密算法有一定了解,熟悉Fabric、Ethereum、Ipfs等至少一个相关开源项目,有研究和贡献经验的优先;
5. 熟悉 Linux、分布式、智能合约、共识机制和算法、多线程及高性能的设计与编码及性能调优优先考虑;
6. 具有强烈的好奇心和独立思考能力,学习能力强,接受新事物能力强。
7. 具备以下背景或经验之一者优先:
– 参与过网络框架、搜索引擎、分布式数据库、云计算平台等底层平台或组件开发
– 熟悉主流开源区块链系统细节设计
– 熟悉BFT、Paxos、Raft等一致性协议之一的细节
– 熟悉PoW,PoS等区块链共识算法/协议细节
岗位职责:
1、负责区块链业务的系统分析与设计工作,开发基于联盟链平台架构设计和核心代码开发;
2、在特定的业务场景下,搭建区块链的基础架构(包括后端协议、基础架构、系统服务、共识机制和算法及其相关客户端),开发和完善基于区块链的服务产品;
3、优秀的你甚至可能成为一位全方位的区块链技术人才,跟进区块链相关的最前沿的技术方向
岗位要求
1. 对区块链技术有浓厚兴趣;
2. 本科及以上学历,计算机、软件工程、数学或信息技术相关专业;
3. 熟练掌握Golang、Java、C/C++中至少一种主流编程语言,具有良好的编程能力和编程习惯;
4. 熟悉各种数据结构和算法,对密码学,安全协议和加密算法有一定了解,熟悉Fabric、Ethereum、Ipfs等至少一个相关开源项目,有研究和贡献经验的优先;
5. 熟悉 Linux、分布式、智能合约、共识机制和算法、多线程及高性能的设计与编码及性能调优优先考虑;
6. 具有强烈的好奇心和独立思考能力,学习能力强,接受新事物能力强。
7. 具备以下背景或经验之一者优先:
– 参与过网络框架、搜索引擎、分布式数据库、云计算平台等底层平台或组件开发
– 熟悉主流开源区块链系统细节设计
– 熟悉BFT、Paxos、Raft等一致性协议之一的细节
– 熟悉PoW,PoS等区块链共识算法/协议细节
蚂蚁金服
职位描述:
1、负责区块链系统核心数据据结构和算法的设计和开发;
2、负责区块链系统核心模块的设计和开发;
职位要求:
1、5年以上工作经历,良好的计算机编程技术基础;
2、熟悉开源的区块链系统之一,了解其架构和核心数据结构,Ethereum、Bitcoin、HyperLedger等;
3、熟悉分布式一致性算法或区块链共识协议之一Paxos、Raft 、PBFT、PoW、PoS、Algorand等;
4、精通C++,GoLang等编程语言之一,熟悉Linux应用开发;
5、熟悉分布式、 多线程及高性能的设计与编码及性能调优;
6、逻辑能力强、思维活跃,接受新事物能力强;
7、性格开朗乐观,责任心强,积极主动,善于沟通,具有团队精神
职位描述:
1、负责区块链系统核心数据据结构和算法的设计和开发;
2、负责区块链系统核心模块的设计和开发;
职位要求:
1、5年以上工作经历,良好的计算机编程技术基础;
2、熟悉开源的区块链系统之一,了解其架构和核心数据结构,Ethereum、Bitcoin、HyperLedger等;
3、熟悉分布式一致性算法或区块链共识协议之一Paxos、Raft 、PBFT、PoW、PoS、Algorand等;
4、精通C++,GoLang等编程语言之一,熟悉Linux应用开发;
5、熟悉分布式、 多线程及高性能的设计与编码及性能调优;
6、逻辑能力强、思维活跃,接受新事物能力强;
7、性格开朗乐观,责任心强,积极主动,善于沟通,具有团队精神
华为
岗位职责:
针对区块链核心平台及去中心化中间件,完成关键技术创新及系统的设计与开发,构建面向公司主航道产品的高容错、高性能的区块链系统及去中心化中间件。
岗位要求:
1、本科及本科以上学历,4年以上分布式系统设计、开发及测试经验,有区块链相关平台或产品解决方案开发实施经验者优先;
2、熟悉区块链技术及相关平台产品,如Hyperledger Fabric、Ethereum、Corda、Blockchain as a Service等,有区块链相关开源项目开发经验者/贡献者优先;
3、熟悉BFT,PoS/DPoS,PoW等共识机制、算法及系统设计者优先;
4、有中间件开发经验,熟悉分布式消息系统原理、P2P、数据同步、签名、加密等关键技术者优先
岗位职责:
针对区块链核心平台及去中心化中间件,完成关键技术创新及系统的设计与开发,构建面向公司主航道产品的高容错、高性能的区块链系统及去中心化中间件。
岗位要求:
1、本科及本科以上学历,4年以上分布式系统设计、开发及测试经验,有区块链相关平台或产品解决方案开发实施经验者优先;
2、熟悉区块链技术及相关平台产品,如Hyperledger Fabric、Ethereum、Corda、Blockchain as a Service等,有区块链相关开源项目开发经验者/贡献者优先;
3、熟悉BFT,PoS/DPoS,PoW等共识机制、算法及系统设计者优先;
4、有中间件开发经验,熟悉分布式消息系统原理、P2P、数据同步、签名、加密等关键技术者优先
top
1、负责参与区块链项目,进行加密算法、分布式算法、共识算法的研究;
2、负责各类密码相关算法解读、编写;
3、负责区块链底层算法的前瞻性预研,指导制定共识算法的设计与优化;
4、参与相应项目模块的开发及文档编写。
任职要求:
1、算法、数学、密码等相关专业硕士及以上学历毕业;
2、掌握扎实的数据结构和算法技术;
3、技术能力扎实,能快速学习掌握新技术,有相关项目经验优先;
4、具备分布式共识算法的设计和研发经验,有参与实现过相关算法等的优先;
5、熟悉常见共识算法的原理(Paxos、RAFT、PBFT等);
6、熟悉至少一门编程语言(C/C++,Java,GO,python等);
1、负责参与区块链项目,进行加密算法、分布式算法、共识算法的研究;
2、负责各类密码相关算法解读、编写;
3、负责区块链底层算法的前瞻性预研,指导制定共识算法的设计与优化;
4、参与相应项目模块的开发及文档编写。
任职要求:
1、算法、数学、密码等相关专业硕士及以上学历毕业;
2、掌握扎实的数据结构和算法技术;
3、技术能力扎实,能快速学习掌握新技术,有相关项目经验优先;
4、具备分布式共识算法的设计和研发经验,有参与实现过相关算法等的优先;
5、熟悉常见共识算法的原理(Paxos、RAFT、PBFT等);
6、熟悉至少一门编程语言(C/C++,Java,GO,python等);
1. 从事区块链方向的设计和研发工作,研究区块链的协议,运行机制和底层实现等。
2. 对项目制定和实施技术决策和技术方案,架构设计与升级优化。
3. 针对业务需求,编写智能合约测试用例和测试脚本;
4. 根据需求和应用场景,开发智能合约;
5. 配合项目团队完成区块链核心平台、产品线的架构与规划;
任职要求
1. 本科以上学历,3年以区块链项目的实际开发经验,计算机网络相关专业优先;
2. 精通linux,有区块链项目的研发及部署经验优先;
3. 熟悉Golang/C++/Rust/Python等一种或多种语言,具有良好的编程能力和编程习惯
4. 熟悉Bitcoin,Ethereum,EOS、Polkadot、Cosmos、Libra、Grin等区块链底层技术与原理;
5. 理解各类主流的共识算法,包括不限于PoW,PoS,DPoS,PBFT,Paxos,Raft等;
6. 熟悉各种数据结构和算法,对密码学,安全协议和加密算法有研究;
7. 掌握TCP、UDP协议,了解BT协议和P2P网络等;
2. 对项目制定和实施技术决策和技术方案,架构设计与升级优化。
3. 针对业务需求,编写智能合约测试用例和测试脚本;
4. 根据需求和应用场景,开发智能合约;
5. 配合项目团队完成区块链核心平台、产品线的架构与规划;
任职要求
1. 本科以上学历,3年以区块链项目的实际开发经验,计算机网络相关专业优先;
2. 精通linux,有区块链项目的研发及部署经验优先;
3. 熟悉Golang/C++/Rust/Python等一种或多种语言,具有良好的编程能力和编程习惯
4. 熟悉Bitcoin,Ethereum,EOS、Polkadot、Cosmos、Libra、Grin等区块链底层技术与原理;
5. 理解各类主流的共识算法,包括不限于PoW,PoS,DPoS,PBFT,Paxos,Raft等;
6. 熟悉各种数据结构和算法,对密码学,安全协议和加密算法有研究;
7. 掌握TCP、UDP协议,了解BT协议和P2P网络等;
1. 配合团队业务需求系统分析,提出技术研究可行性报告和区块链系统架构设计;
2. 结合需求设计开发高扩展性、高性能、安全、稳定、可靠的软件技术系统;
3. 负责制定技术开发计划,管控开发进度和质量;
4. 组织开发团队研究框架,负责软件系统核心代码的开发和维护;
5. 团队组建管理,提升团队技术水平。
岗位要求:
1. 3-5年C++/Java/Go等开发经验,1-2年软件架构设计经验,熟悉Linux环境下的软件系统开发;
2. 熟悉区块链的主流技术框架,能合理使用相应技术进行分布式应用的构架设计;
3. 结果导向、有创业精神、团队协作精神及良好的自我驱动力;
4. 熟悉网络编程,有实际大数据量的数据库设计经验;
5. 熟悉缓存技术,网站优化,服务器优化,集群技术处理、网站负载均衡、系统性能调优等软件编程高级技术;
6. 具有一定的软件安全设计能力;
7. 良好的逻辑思维能力,熟悉业务抽象和数据模型设计,具有很强的分析问题和解决问题的能力;
8. 知识面广,思路开阔,创新能力强,有较好的英文文献/技术文档的学习能力,对新技术持有敏感性并愿意致力于新技术的探索和研究。
具备以下条件之一或以上者优先考虑:
1. 拥有大型业务系统架构开发经验优先;
2. 熟悉区块链系统架构者优先;
3. 有智能合约开发经验的优先;
4. 拥有作为技术领导者带领5人以上团队进行敏捷开发者优先;
5. 对安全多方计算、联邦学习等有一定了解的优先;
6. 熟悉桌面应用开发者优先;
2. 结合需求设计开发高扩展性、高性能、安全、稳定、可靠的软件技术系统;
3. 负责制定技术开发计划,管控开发进度和质量;
4. 组织开发团队研究框架,负责软件系统核心代码的开发和维护;
5. 团队组建管理,提升团队技术水平。
岗位要求:
1. 3-5年C++/Java/Go等开发经验,1-2年软件架构设计经验,熟悉Linux环境下的软件系统开发;
2. 熟悉区块链的主流技术框架,能合理使用相应技术进行分布式应用的构架设计;
3. 结果导向、有创业精神、团队协作精神及良好的自我驱动力;
4. 熟悉网络编程,有实际大数据量的数据库设计经验;
5. 熟悉缓存技术,网站优化,服务器优化,集群技术处理、网站负载均衡、系统性能调优等软件编程高级技术;
6. 具有一定的软件安全设计能力;
7. 良好的逻辑思维能力,熟悉业务抽象和数据模型设计,具有很强的分析问题和解决问题的能力;
8. 知识面广,思路开阔,创新能力强,有较好的英文文献/技术文档的学习能力,对新技术持有敏感性并愿意致力于新技术的探索和研究。
具备以下条件之一或以上者优先考虑:
1. 拥有大型业务系统架构开发经验优先;
2. 熟悉区块链系统架构者优先;
3. 有智能合约开发经验的优先;
4. 拥有作为技术领导者带领5人以上团队进行敏捷开发者优先;
5. 对安全多方计算、联邦学习等有一定了解的优先;
6. 熟悉桌面应用开发者优先;
工作内容:
1.能够独立进行区块链底层系统及应用平台的功能定义和架构设计,研究区块链的协议,运行机制、底层实现和应用平台研发等
2.从事区块链产品的设计和研发工作,研究区块链的协议,运行机制和底层实现等;
3.指导项目团队成员的日常开发工作,解决开发中的技术问题,推进团队伙伴完成项目落地。
任职条件:
1.计算机、软件工程等相关专业,本科及以上学历;
2.从事区块链实际开发研究1年或以上优先考虑;
3.从事C/C++ 一线开发4年或以上。
4.很强的学习,思考和总结能力; 有清晰的思路和方法论去解决未知问题,非常高的代码质量,对技术精益求精甚至有完美主义。
5.基础技能
1)精通C++编程;精通Linux下C++调试技巧,善于解决各类线上问题;
2)熟练使用各种数据结构和算法;
3)熟练使用多线程、多CPU内核,消息队列、异步通信、进程间通信、应用层安全协议开发等 。
4)精通分布式数据库集群开发, 有Level-DB, Memcached, Redis等集群开发和优化经验优先。
5)精通分布式存储系统开发者优先。
6)有高并发、大数据、微服务、安全通信、系统内核优化等 经验者优先;
7)有完整系统设计、服务治理等 经验者优先。
6.专业技能
1)深入理解常用区块链共识算法运作原理和优劣,包括POW,POS,DPOS,PBFT, VRF。
2)熟练使用 Merkel Tree, Hash计算,Grossip, 随机算法 ; 端到端加密,对称和非对称加密算法,X25519,Ed25519算法 。
3)熟练掌握签名,多重签名,环或群签名,CA证书认证,PKI证书技术。
4)精通PBFT 共识算法的开发和优化者优先。
5)精通P2P网络,有Kademlia 网络的开发和优化者优先。
1.能够独立进行区块链底层系统及应用平台的功能定义和架构设计,研究区块链的协议,运行机制、底层实现和应用平台研发等
2.从事区块链产品的设计和研发工作,研究区块链的协议,运行机制和底层实现等;
3.指导项目团队成员的日常开发工作,解决开发中的技术问题,推进团队伙伴完成项目落地。
任职条件:
1.计算机、软件工程等相关专业,本科及以上学历;
2.从事区块链实际开发研究1年或以上优先考虑;
3.从事C/C++ 一线开发4年或以上。
4.很强的学习,思考和总结能力; 有清晰的思路和方法论去解决未知问题,非常高的代码质量,对技术精益求精甚至有完美主义。
5.基础技能
1)精通C++编程;精通Linux下C++调试技巧,善于解决各类线上问题;
2)熟练使用各种数据结构和算法;
3)熟练使用多线程、多CPU内核,消息队列、异步通信、进程间通信、应用层安全协议开发等 。
4)精通分布式数据库集群开发, 有Level-DB, Memcached, Redis等集群开发和优化经验优先。
5)精通分布式存储系统开发者优先。
6)有高并发、大数据、微服务、安全通信、系统内核优化等 经验者优先;
7)有完整系统设计、服务治理等 经验者优先。
6.专业技能
1)深入理解常用区块链共识算法运作原理和优劣,包括POW,POS,DPOS,PBFT, VRF。
2)熟练使用 Merkel Tree, Hash计算,Grossip, 随机算法 ; 端到端加密,对称和非对称加密算法,X25519,Ed25519算法 。
3)熟练掌握签名,多重签名,环或群签名,CA证书认证,PKI证书技术。
4)精通PBFT 共识算法的开发和优化者优先。
5)精通P2P网络,有Kademlia 网络的开发和优化者优先。
子主题
数据层
默克尔树(Merkle Tree)
定义
Merkle Tree,通常也被称作Hash Tree,顾名思义,就是存储hash值的一棵树。Merkle树的叶子是数据块(例如,文件或者文件的集合)的hash值。非叶节点是其对应子节点串联字符串的hash。
应用
旨在解决跨链事务流程中交易存在性证明的问题。 在区块链系统中,轻节点为了完成对某一笔交易的验证,
即在不下载所有区块的情况下检查某个区块是否包含了某笔交易,需要借助一种特殊的数据结构,
即默克尔树(Merkle Tree),也叫哈希树。
即在不下载所有区块的情况下检查某个区块是否包含了某笔交易,需要借助一种特殊的数据结构,
即默克尔树(Merkle Tree),也叫哈希树。
1.快速比较大量数据
对每组数据排序后构建默克尔树结构。当两个默克尔树根相同时,则意味着两组数据必然相同。否则,必然存在不同。
由于Hash计算的过程可以十分快速,预处理可以在短时间内完成。利用默克尔树结构能带来巨大的比较性能优势。
2.快速定位修改
例如图5-3中,如果D1中数据被修改,会影响到N1、N4和Root。
因此,一旦发现某个节点如Root的数值发生变化,沿着Root→N4→N1,最多通过O(lgn)时间即可快速定位到实际发生改变的数据块D1。
对每组数据排序后构建默克尔树结构。当两个默克尔树根相同时,则意味着两组数据必然相同。否则,必然存在不同。
由于Hash计算的过程可以十分快速,预处理可以在短时间内完成。利用默克尔树结构能带来巨大的比较性能优势。
2.快速定位修改
例如图5-3中,如果D1中数据被修改,会影响到N1、N4和Root。
因此,一旦发现某个节点如Root的数值发生变化,沿着Root→N4→N1,最多通过O(lgn)时间即可快速定位到实际发生改变的数据块D1。
3.零知识证明
仍以图5-3为例,如何向他人证明拥有的某组数据(D0……D3)中包括给定某个内容D0而不暴露其他任何内容。
很简单,构造如图所示的一个默克尔树,公布N1、N5、Root。D0拥有者通过验证生成的Root是否跟提供的值一致,即可很容易检测D0存在。整个过程中验证者无法获知其他内容。
仍以图5-3为例,如何向他人证明拥有的某组数据(D0……D3)中包括给定某个内容D0而不暴露其他任何内容。
很简单,构造如图所示的一个默克尔树,公布N1、N5、Root。D0拥有者通过验证生成的Root是否跟提供的值一致,即可很容易检测D0存在。整个过程中验证者无法获知其他内容。
hash
Hash是一个把任意长度的数据映射成固定长度数据的函数。例如,对于数据完整性校验,最简单的方法是对整个数据做Hash运算得到固定长度的Hash值,然后把得到的Hash值公布在网上,这样用户下载到数据之后,对数据再次进行Hash运算,比较运算结果和网上公布的Hash值进行比较,如果两个Hash值相等,说明下载的数据没有损坏。
Hash List
背景:如果从一个稳定的服务器进行下载,采用单一Hash是可取的。但如果数据源不稳定,一旦数据损坏,就需要重新下载,这种下载的效率是很低的。
方法
在点对点网络中作数据传输的时候,会同时从多个机器上下载数据,而且很多机器可以认为是不稳定或者不可信的。为了校验数据的完整性,更好的办法是把大的文件分割成小的数据块(例如,把分割成2K为单位的数据块)。这样的好处是,如果小块数据在传输过程中损坏了,那么只要重新下载这一快数据就行了,不用重新下载整个文件。
把每个小块数据的Hash值拼到一起,然后对这个长字符串在作一次Hash运算,这样就得到Hash列表的根Hash(Top Hash or Root Hash)。下载数据的时候,首先从可信的数据源得到正确的根Hash,就可以用它来校验Hash列表了,然后通过校验后的Hash列表校验数据块。
Merkle Tree
Merkle Tree可以看做Hash List的泛化(Hash List可以看作一种特殊的Merkle Tree,即树高为2的多叉Merkle Tree)。
Merkle Tree和Hash List的主要区别是,可以直接下载并立即验证Merkle Tree的一个分支。因为可以将文件切分成小的数据块,这样如果有一块数据损坏,仅仅重新下载这个数据块就行了。如果文件非常大,那么Merkle tree和Hash list都很到,但是Merkle tree可以一次下载一个分支,然后立即验证这个分支,如果分支验证通过,就可以下载数据了。而Hash list只有下载整个hash list才能验证。
特点
它是一种树,大多数是二叉树,也可以是多叉树,具有树结构的所有特点。
Merkle Tree的叶子节点是数据块的哈希。
Merkle Tree的非叶子节点的哈希值是根据它下面所有叶子节点的值哈希计算得到
备注:如果最开始叶子节点是奇数个,可以复制最后一个叶子节点,凑成偶数个。
Merkle Tree的叶子节点是数据块的哈希。
Merkle Tree的非叶子节点的哈希值是根据它下面所有叶子节点的值哈希计算得到
备注:如果最开始叶子节点是奇数个,可以复制最后一个叶子节点,凑成偶数个。
检索数据块时间复杂度Log(N)
eos中如何构建默克尔树
1. 当transaction被打包到区块中之后会有一个区块信息的确认,即:finalize_block
2. 我们看到了set_action_merkle以及set_trx_merkle对action以及transaction进行默克尔树的构建,继续来看
3. 不管是set_action_merkle还是set_trx_merkle最后都传入action和trx数组调用了Merkle方法,即先获取action或者transaction的摘要信息,然后进行默克尔树的构建
4.我们来看Merkle函数,在Merkle.cpp中:无论个数是奇数(对于奇数再次push最后一个凑成偶数)还是偶数分别进行了hash,最终形成了默克尔树的构建
2. 我们看到了set_action_merkle以及set_trx_merkle对action以及transaction进行默克尔树的构建,继续来看
3. 不管是set_action_merkle还是set_trx_merkle最后都传入action和trx数组调用了Merkle方法,即先获取action或者transaction的摘要信息,然后进行默克尔树的构建
4.我们来看Merkle函数,在Merkle.cpp中:无论个数是奇数(对于奇数再次push最后一个凑成偶数)还是偶数分别进行了hash,最终形成了默克尔树的构建
基于Merkle树交易存在性证明
Merkle Tree被用来保存交易的数字指纹,实现对区块内所有交易的归纳,最后达到快速验证某区块是否包含指定交易的目的。假设上图是区块X的Merkle Tree结构,如果要验证交易D是否在区块X中,无需返回区块X,只需要提供交易D,H_AB,H_C以及Merkle Root则可。计算方法如下: 根据交易D的下标和交易D计算出哈希,得到H_D;根据H_C和H_D计算哈希,得到H_CD;根据H_AB和H_CD计算哈希,得到H_ABCD;对比H_ABCD和Merkle Root,如果相同,则证明区块X存在交易D,否则说明不存在。
PKI技术
CA证书
CA证书顾名思义就是由CA(Certification Authority)机构发布的数字证书。它是公钥基础设施(Public Key Infrastructure,PKI)的核心。
CA是负责签发证书、认证证书、管理已颁发证书的机关。
CA是负责签发证书、认证证书、管理已颁发证书的机关。
证书的内容包括:电子签证机关的信息、公钥用户信息、公钥、权威机构的签字和有效期等等。证书的格式和验证方法普遍遵循X.509 国际标准。
基础概念
csr文件:证书请求文件(CSR,Cerificate Signing Request),CSR是您的公钥证书原始文件,包含了您的服务器信息和您的单位信息,需要提交给CA认证中心。
crl文件:证书吊销列表 (Certificate Revocation List ,简称: CRL) 是 PKI 系统中的一个结构化数据文件,该文件包含了证书颁发机构 (CA) 已经吊销的证书的序列号及其吊销日期
crt文件:签名证书文件
crl文件:证书吊销列表 (Certificate Revocation List ,简称: CRL) 是 PKI 系统中的一个结构化数据文件,该文件包含了证书颁发机构 (CA) 已经吊销的证书的序列号及其吊销日期
crt文件:签名证书文件
通俗的概述:
首先一个大家都认可的一个机构(CA),有一个证书(rootcert),然后大家都能获取到这个证书,从证书里面取到CA的公钥信息,去验证它发出去的消息,获取它签名的消息。
其次CA可以给它验证过的节点签发证书(cert),这个证书跟上面的rootcert是一个格式的,且是CA签名过的。其他节点能从这个cert中确认几点:证书确实是由CA签发的,解析证书里面的公钥信息,能验证两个节点之间发送的消息的正确性和有效性
当前,整个系统可能不只一个CA。CA认可了CA1...CAn,由CAn签发的证书也是能在系统中流通的,这就是一个证书链的概念。
其次CA可以给它验证过的节点签发证书(cert),这个证书跟上面的rootcert是一个格式的,且是CA签名过的。其他节点能从这个cert中确认几点:证书确实是由CA签发的,解析证书里面的公钥信息,能验证两个节点之间发送的消息的正确性和有效性
当前,整个系统可能不只一个CA。CA认可了CA1...CAn,由CAn签发的证书也是能在系统中流通的,这就是一个证书链的概念。
标准概念
一 个简单的PKI系统包括证书机构CA(Certificate Of Authority,认证中心)、注册机构RA和相应的PKI存储库。CA用于签发并管理证书;RA可作为CA的一部分,也可以独立,其功能包括个人身份审核、CRL管理、密钥产生和密钥对备份等;PKI存储库包括LDAP(Lightweight Directory Access Protocol,轻量目录访问协议)目录服务器和普通数据库,用于对用户申请、证书、密钥、CRL(Certificate revocation lists)和日志等信息进行存储和管理,并提供一定的查询功能。
证书申请过程
• 用户申请:用户获取CA的数字证书(根证书),与安全服务器建立连接;生成自己的公钥和私钥,将公钥和自己的身份信息提交给安全服务器,安全服务器将用户的申请信息传送给RA服务器。
• RA审核:RA收到用户的申请,用户向RA证明自己的身份,RA进行核对。如果RA同意用户申请证书的请求,则对证书申请信息做数字签名;否则拒绝用户的申请。
• CA发行证书:RA将用户申请和RA签名传输给CA,CA对RA数字签名做认证,如果验证通过,则同意用户请求,颁发证书,然后将证书输出。如果验证不通过,则拒绝证书申请。
• RA转发证书:RA从CA得到新的证书,首先将证书输出到LDAP服务器以提供目录浏览,再通知用户证书发行成功,告知证书序列号,到指定的网址去下载证书。
• 用户证书获取:用户使用证书序列号去指定网址下载自己的数字证书
上述过程中,我们关注:有一个私钥文件、一个证书文件,其中证书文件中包涵了与私钥有关的公钥,且证书中有CA的授权,CA是一个大家公认的可信的第三方
• RA审核:RA收到用户的申请,用户向RA证明自己的身份,RA进行核对。如果RA同意用户申请证书的请求,则对证书申请信息做数字签名;否则拒绝用户的申请。
• CA发行证书:RA将用户申请和RA签名传输给CA,CA对RA数字签名做认证,如果验证通过,则同意用户请求,颁发证书,然后将证书输出。如果验证不通过,则拒绝证书申请。
• RA转发证书:RA从CA得到新的证书,首先将证书输出到LDAP服务器以提供目录浏览,再通知用户证书发行成功,告知证书序列号,到指定的网址去下载证书。
• 用户证书获取:用户使用证书序列号去指定网址下载自己的数字证书
上述过程中,我们关注:有一个私钥文件、一个证书文件,其中证书文件中包涵了与私钥有关的公钥,且证书中有CA的授权,CA是一个大家公认的可信的第三方
数字证书
证书的内容包括:电子签证机关的信息、公钥用户信息、公钥、权威机构的签字和有效期等等。证书的格式和验证方法普遍遵循X.509 国际标准。,证书可以以.pem或者.crt结尾。x509v3证书格式
• Certificate
• Version Number
• Serial Number
• Signature Algorithm ID
• Issuer Name
• Validity period
• Not before
• Not after
• Subject Name
• Subject pbulic Key Info
• Public Key Algorithm
• Subject Public Key
• Issuer Unique Identifier (optional)
• Subject Unique Identifier (optional)
• Extensions (optional)
• …
• Certificate Sigature Algorithm
• Certificate Signature
• Certificate
• Version Number
• Serial Number
• Signature Algorithm ID
• Issuer Name
• Validity period
• Not before
• Not after
• Subject Name
• Subject pbulic Key Info
• Public Key Algorithm
• Subject Public Key
• Issuer Unique Identifier (optional)
• Subject Unique Identifier (optional)
• Extensions (optional)
• …
• Certificate Sigature Algorithm
• Certificate Signature
使用证书验证过程
1. 将客户端发来的数据解密 (如解开数字信封)。
2. 将解密后的数据分解成原始数据,签名数据和客户证书三部分。
3. 用CA根证书验证客户证书的签名完整性。 ---首先验证用户证书是可信的
4. 检查客户证书是否有效 (当前时间在证书结构中的所定义的有效期内)。
5. 检查客户证书是否作废 (OCSP方式或CRL方式)。
6. 验证客户证书结构中的证书用途。
7. 客户证书验证原始数据的签名完整性。 ---从可信的证书中提取出公钥信息,然后用公钥对消息体hash解密等,确保发送的数据没有被篡改。
2. 将解密后的数据分解成原始数据,签名数据和客户证书三部分。
3. 用CA根证书验证客户证书的签名完整性。 ---首先验证用户证书是可信的
4. 检查客户证书是否有效 (当前时间在证书结构中的所定义的有效期内)。
5. 检查客户证书是否作废 (OCSP方式或CRL方式)。
6. 验证客户证书结构中的证书用途。
7. 客户证书验证原始数据的签名完整性。 ---从可信的证书中提取出公钥信息,然后用公钥对消息体hash解密等,确保发送的数据没有被篡改。
联盟链证书的使用
趣链CA证书
准入证书
需要加入联盟链的节点或者客户端,向EACA提供公钥和身份信息, EACA利用EARTCERT与其相对应的私钥,对需要加入联盟链的节点颁发准入证书ECERT,所有 的节点和客户端都需要申请ECERT。
使用场景
在联盟链节点完成节点之间的相互连接的过程中,记连接发起节点 为B,被动连接节点记为A,在联盟链建立之时或新节点加入时,节点A需要验证所有向自己 连接的节点的权限。节点B在发起连接的同时将ECERT发送到被动连接节点A处,节点A验证 节点B的证书的合法性以及附带信息的来源,验证A的身份信息,若通过则允许节点B连接到 节点A。
角色证书
需要加入联盟链的验证节点VP将自己的公钥和身份信息线下提供给 RACA,RACA利用RARTCERT与其对应的私钥,结合对需要加入的联盟链的验证节点VP颁发角色证书RCERT
使用场景
节点角色鉴权:联盟链节点相互连接之时需要对节点角色进行鉴别,如果是验证节 点,则该节点连接之时会附带RCERT,在被动连接节点A验证通过之后,节点A会将连接发起 节点B标记为验证节点,并将验证消息转发至B。
密码学
对称加密
DES(Data EncryptionStandard)
数据加密标准,速度较快,适用于加密大量数据的场合.经典的分组加密算法,1977年由美国联邦信息处理标准(FIPS)采用FIPS-46-3,将64位明文加密为64位的密文,其密钥长度为64位(包含8位校验位)。现在已经很容易被暴力破解;
3DES(Triple DES)
基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高.但现在也被认为不够安全;
AES(Advanced EncryptionStandard)
AES也为分组密码,分组密码也就是把明文分成一组一组的,每组长度相等,每次加密一组数据,直到加密完整个明文。
在AES标准规范中,分组长度只能是128位,也就是说,每个分组为16个字节(每个字节8位)。密钥的分组长度可以使用128位、
192位或256位。密钥的长度不同,推荐加密轮数也不同。AES的优势在于处理速度快,整个过程可以用数学描述,目前尚未有有效的破解手段;
在AES标准规范中,分组长度只能是128位,也就是说,每个分组为16个字节(每个字节8位)。密钥的分组长度可以使用128位、
192位或256位。密钥的长度不同,推荐加密轮数也不同。AES的优势在于处理速度快,整个过程可以用数学描述,目前尚未有有效的破解手段;
实现原理
从实现原理上可以分为两种:分组密码和序列密码。前者将明文切分为定长数据块作为基本加密单位,应用最为广泛,分组对称加密代表算法包括DES、3DES、AES、IDEA等:。后者则每次只对一个字节或字符进行加密处理,且密码不断变化,只用在一些特定领域,如数字媒介的加密等。
序列密码
又称流密码。1949年,Claude Elwood Shannon(信息论创始人)首次证明,要实现绝对安全的完善保密性(perfect secrecy),可以通过“一次性密码本”的对称加密处理。即通信双方每次使用跟明文等长的随机密钥串对明文进行加密处理。序列密码采用了类似的思想,每次通过伪随机数生成器来生成伪随机密钥串。代表算法包括RC4等。
分组加密的填充
非对称加密
RSA加密法
RSA 公司发明,是一个支持变长密钥的公共密钥算法,需要加密的文件块的长度也是可变的
DSA(Digital SignatureAlgorithm)
数字签名算法,是一种标准的DSS(数字签名标准),严格来说不算加密算法
ECC(Elliptic CurvesCryptography)
椭圆曲线密码编码学.ECC和RSA相比具有多方面的绝对优势,主要有:抗攻击性强.相同的密钥长度,其抗攻击性要强很多倍.计算量小,处理速度快.ECC总的速度比RSA、DSA要快得多.存储空间占用小.ECC的密钥尺寸和系统参数与RSA、DSA相比要小得多,意味着它所占的存贮空间要小得多.这对于加密算法在IC卡上的应用具有特别重要的意义.带宽要求低.当对长消息进行加解密时,三类密码系统有相同的带宽要求,但应用于短消息时ECC带宽要求却低得多.带宽要求低使ECC在无线网络领域具有广泛的应用前景
现代备受关注的算法系列,基于对椭圆曲线上特定点进行特殊乘法逆运算难以计算的特性。最早在1985年由Neal Koblitz和Victor Miller分别独立提出。ECC系列算法一般被认为具备较高的安全性,但加解密计算过程往往比较费时;
原理
非对称加密算法中,加密密钥和解密密钥是不同的,分别称为公钥(public key)和私钥(private key)。私钥一般需要通过随机数算法生成,公钥可以根据私钥生成。公钥一般是公开的,他人可获取的;私钥一般是个人持有,他人不能获取。
目前普遍认为RSA类算法可能在不远的将来被破解,一般推荐可采用安全强度更高的椭圆曲线系列算法,ECC将会是今后最重要的主流公钥加密技术。
数字签名
消息认证码与数字签名
消息认证码和数字签名技术通过对消息的摘要进行加密,可用于消息防篡改和身份证明问题。
一个典型的场景是,Alice通过信道发给Bob一个文件(一份信息),Bob如何获知所收到的文件即为Alice发出的原始版本?Alice可以先对文件内容进行摘要,然后用自己的私钥对摘要进行加密(签名),之后同时将文件和签名都发给Bob。Bob收到文件和签名后,用Alice的公钥来解密签名,得到数字摘
要,与收到文件进行摘要后的结果进行比对。如果一致,说明该文件确实是Alice发过来的(别人无法拥有Alice的私钥),并且文件内容没有被修改过(摘要结果一致)。
要,与收到文件进行摘要后的结果进行比对。如果一致,说明该文件确实是Alice发过来的(别人无法拥有Alice的私钥),并且文件内容没有被修改过(摘要结果一致)。
除普通的数字签名应用场景外,针对一些特定的安全需求,产生了一些特殊数字签名技术,包括盲签名、多重签名、群签名、环签名等。
1.盲签名
盲签名(blind signature)是在1982年由David Chaum在论文《Blind Signatures for Untraceable Payment》中提出。签名者需要在无法看到原始内容的前提下对信息进行签名。
盲签名可以实现对所签名内容的保
护,防止签名者看到原始内容;另一方面,盲签名还可以实现防止追踪(unlinkability),签名者无法将签名内容和签名结果进行对应。典型的实现包括RSA盲签名算法等。
盲签名可以实现对所签名内容的保
护,防止签名者看到原始内容;另一方面,盲签名还可以实现防止追踪(unlinkability),签名者无法将签名内容和签名结果进行对应。典型的实现包括RSA盲签名算法等。
一般的签名,签名者对自己发出的签名,必须是记得的,比如,在何时何地对谁发的,他自己可以记下来。但是,如果把签名看作是电子现金的话,就涉及到一个匿名性的问题
用实际钞票的时候,钞票上有没有写你的名字?当然没有。那我也不希望,银行通过追踪自己发出签名,来获得用户的消费情况。于是就设计出盲签名。
用实际钞票的时候,钞票上有没有写你的名字?当然没有。那我也不希望,银行通过追踪自己发出签名,来获得用户的消费情况。于是就设计出盲签名。
盲签名允许消息者先将消息盲化,而后让签名者对盲化的消息进行签名,最后消息拥有者将签名除去盲因子,得到签名者关于原消息的签名。这是接收者在不让签名者获取所签署消息具体内容的情况下所采取的一种特殊的数字签名技术,它除了满足一般的数字签名条件外,还必须满足下面的两条性质。
•签名者对其所签署的消息是不可见的,即签名者不知道他所签署消息的具体内容。
•签名消息不可追踪,即当签名消息被公布后,签名者无法知道这是他哪次签署的。
•签名者对其所签署的消息是不可见的,即签名者不知道他所签署消息的具体内容。
•签名消息不可追踪,即当签名消息被公布后,签名者无法知道这是他哪次签署的。
2.多重签名
多重签名(multiple signature)即n个签名者中,收集到至少m个(n>=m>=1)的签名,即认为合法。其中,n是提供的公钥个数,m是需要匹配公钥的最少的签名个数。
多重签名可以有效地被应用在多人投票共同决策的场景中。例如双方进行协商,第三方作为审核方。三方中任何两方达成一致即可完成协商。
比特币交易中就支持多重签名,可以实现多个人共同管理某个账户的比特币交易。
多重签名可以有效地被应用在多人投票共同决策的场景中。例如双方进行协商,第三方作为审核方。三方中任何两方达成一致即可完成协商。
比特币交易中就支持多重签名,可以实现多个人共同管理某个账户的比特币交易。
3.群签名
群签名(group signature)即某个群组内一个成员可以代表群组进行匿名签名。签名可以验证来自于该群组,却无法准确追踪到签名的是哪个成员。
群签名需要存在一个群管理员来添加新的群成员,因此存在群管理员可能追踪到签名成员身份的风险。
群签名最早于1991年由David Chaum和Eugene van Heyst提出。
群签名需要存在一个群管理员来添加新的群成员,因此存在群管理员可能追踪到签名成员身份的风险。
群签名最早于1991年由David Chaum和Eugene van Heyst提出。
4.环签名
环签名(ring signature),由Rivest、Shamir和Tauman三位密码学家在2001年首次提出。环签名属于一种简化的群签名。环签名中只有环成员没有管理者,不需要环成员间的合作。
签名者首先选定一个临时的签名者集合,集合中包括签名者自身。然后签名者利用自己的私钥和签名集合中其他人的公钥就可以独立地产生签名,而无需他人的帮助。
签名者首先选定一个临时的签名者集合,集合中包括签名者自身。然后签名者利用自己的私钥和签名集合中其他人的公钥就可以独立地产生签名,而无需他人的帮助。
例如,某个用户在线下进行消费,并通过比特币进行支付,那么商家事实上建立了对用户的线上(比特币地址)线下(用户身份)关联。为避免个人隐私信息的泄露,用户必须十分谨慎地对其比特币帐户地址进行管理和隔离。从这个角度来而言,比特币无法满足交易不可追踪和不可关联的条件。
而基于群签名(group signatures)基础上环签名(ring signatures)技术,提供了可行的匿名性解决办法。环签名在保护匿名性方面有很多的用途。
而基于群签名(group signatures)基础上环签名(ring signatures)技术,提供了可行的匿名性解决办法。环签名在保护匿名性方面有很多的用途。
过程
1、密钥生成。为环中每个成员产生一个密钥对(公钥PKi,私钥SKi)。
2、签名。签名者用自己的私钥和任意n个环成员(包括自己)的公钥为消息m生成签名a。
3、签名验证。验证者根据环签名。和消息m,验证签名是否为环中成员所签,如果有效就接收,否则丢弃。
2、签名。签名者用自己的私钥和任意n个环成员(包括自己)的公钥为消息m生成签名a。
3、签名验证。验证者根据环签名。和消息m,验证签名是否为环中成员所签,如果有效就接收,否则丢弃。
数字证书
对于非对称加密算法和数字签名来说,很重要的一点就是公钥的分发。理论上任何人可以公开获取到对方的公钥。然而这个公钥有没有可能是伪造的呢?传输过程中有没有可能被篡改掉呢?一旦公钥自身出了问题,则整个建立在其上的安全体系的安全性将不复存在。
数字证书机制正是为了解决这个问题,它就像日常生活中的一个证书一样,可以证明所记录信息的合法性。比如证明某个公钥是某个实体(如组织或个人)的,并且确保一旦内容被篡改能被探测出来,从而实现对用户公钥的安全分发。
根据所保护公钥的用途,可以分为加密数字证书(Encryption Certificate)和签名验证数字证书(Signature Certificate)。前者往往用于保护用于加密信息的公钥;后者则保护用于进行解密签名进行身份验证的公
钥。两种类型的公钥也可以同时放在同一证书中。
根据所保护公钥的用途,可以分为加密数字证书(Encryption Certificate)和签名验证数字证书(Signature Certificate)。前者往往用于保护用于加密信息的公钥;后者则保护用于进行解密签名进行身份验证的公
钥。两种类型的公钥也可以同时放在同一证书中。
证书认证机构(Certification Authority,CA
一般情况下,证书需要由证书认证机构(Certification Authority,CA)来进行签发和背书。权威的证书认证机构包括DigiCert、GlobalSign、VeriSign等。用户也可以自行搭建本地CA系统,在私有网络中进行使用。
一个数字证书内容可能包括基本数据(版本、序列号)、所签名对象信息(签名算法类型、签发者信息、有效期、被签发人、签发的公开密钥)、CA的数字签名,等等。
目前使用最广泛的标准为ITU和ISO联合制定的X.509的v3版本规范(RFC 5280),其中定义了如下证书信息域
一个数字证书内容可能包括基本数据(版本、序列号)、所签名对象信息(签名算法类型、签发者信息、有效期、被签发人、签发的公开密钥)、CA的数字签名,等等。
目前使用最广泛的标准为ITU和ISO联合制定的X.509的v3版本规范(RFC 5280),其中定义了如下证书信息域
证书格式
X.509规范中一般推荐使用PEM(Privacy Enhanced Mail)格式来存储证书相关的文件。证书文件的文件名后缀一般为.crt或.cer,对应私钥文件的文件名后缀一般为.key,证书请求文件的文件名后缀为.csr。有时候也统一用.pem作为文件名后缀。
PEM格式采用文本方式进行存储,一般包括首尾标记和内容块,内容块采用Base64进行编码。
PEM格式采用文本方式进行存储,一般包括首尾标记和内容块,内容块采用Base64进行编码。
可以通过OpenSSL工具来查看其内容:
# openssl x509 -in example.com-cert.pem -noout -text
# openssl x509 -in example.com-cert.pem -noout -text
证书信任链
怎么证明用来验证对实体证书进行签名的CA公钥自身是否合法呢?毕竟在获取CA公钥的过程中,它也可能被篡改掉。
实际上,要想知道CA的公钥是否合法,一方面可以通过更上层的CA颁发的证书来进行认证;另一方面某些根CA(Root CA)可以通过预先分发证书来实现信任基础。例如,主流操作系统和浏览器里面,往往会提前预置一些权威CA的证书(通过自身的私钥签名,系统承认这些是合法的证书)。
之后所有基于这些CA认证过的中间层CA(Intermediate CA)和后继CA都会被验证合法。这样就从预先信任的根证书,经过中间层证书,到最底下的实体证书,构成一条完整的证书信任链。
之后所有基于这些CA认证过的中间层CA(Intermediate CA)和后继CA都会被验证合法。这样就从预先信任的根证书,经过中间层证书,到最底下的实体证书,构成一条完整的证书信任链。
PKI体系
在非对称加密中,公钥可以通过证书机制来进行保护,但证书的生成、分发、撤销等过程并没有在X.509规范中进行定义。
实际上,安全地管理和分发证书可以遵循PKI(Public Key Infrastructure)体系来完成。PKI体系核心解决的是证书生命周期相关的认证和管理问题,在现代密码学应用领域处于十分基础和重要的地位。
需要注意,PKI是建立在公私钥基础上实现安全可靠传递消息和身份确认的一个通用框架,并不代表某个特定的密码学技术和流程。实现了PKI规范的平台可以安全可靠地管理网络中用户的密钥和证书。目前包括多个实现和规范,知名的有RSA公司的PKCS(Public Key Cryptography Standards)标准和X.509相关规范等。
实际上,安全地管理和分发证书可以遵循PKI(Public Key Infrastructure)体系来完成。PKI体系核心解决的是证书生命周期相关的认证和管理问题,在现代密码学应用领域处于十分基础和重要的地位。
需要注意,PKI是建立在公私钥基础上实现安全可靠传递消息和身份确认的一个通用框架,并不代表某个特定的密码学技术和流程。实现了PKI规范的平台可以安全可靠地管理网络中用户的密钥和证书。目前包括多个实现和规范,知名的有RSA公司的PKCS(Public Key Cryptography Standards)标准和X.509相关规范等。
PKI基本组件
一般情况下,PKI至少包括如下核心组件:
·CA(Certification Authority):负责证书的颁发和作废,接收来自RA的请求,是最核心的部分;
·RA(Registration Authority):对用户身份进行验证,校验数据合法性,负责登记,审核过了就发给CA;
·证书数据库:存放证书,多采用X.500系列标准格式。可以配合LDAP目录服务管理用户信息。
其中,CA是最核心的组件,主要完成对证书信息的维护。
·CA(Certification Authority):负责证书的颁发和作废,接收来自RA的请求,是最核心的部分;
·RA(Registration Authority):对用户身份进行验证,校验数据合法性,负责登记,审核过了就发给CA;
·证书数据库:存放证书,多采用X.500系列标准格式。可以配合LDAP目录服务管理用户信息。
其中,CA是最核心的组件,主要完成对证书信息的维护。
操作流程
用户通过RA登记申请证书,提供身份和认证信息等;CA审核后完成证书的制造,颁发给用户。用户如果需要撤销证书则需
要再次向CA发出申请。
要再次向CA发出申请。
证书签发
CA对用户签发证书实际上是对某个用户公钥,使用CA的私钥对其进行签名。这样任何人都可以用CA的公钥对该证书进行合法性验证。验证成功则认可该证书中所提供的用户公钥内容,实现用户公钥的安全分发。
用户证书的签发可以有两种方式。一般可以由CA直接来生成证书(内含公钥)和对应的私钥发给用户;也可以由用户自己生成公钥和私钥,然后由CA来对公钥内容进行签名。
后者情况下,用户一般会首先自行生成一个私钥和证书申请文件(Certificate Signing Request,即csr文件),该文件中包括了用户对应的公钥和一些基本信息,如通用名
(common name,即cn)、组织信息、地理位置等。CA只需要对证书请求文件进行签名,生成证书文件,颁发给用户即可。整个过程中,用户可以保持私钥信息的私密性,不会被其他方获知(包括CA方)。
生成证书申请文件的过程并不复杂,用户可以很容易地使用开源软件openssl来生成csr文件和对应的私钥文件。
例如,安装OpenSSL后可以执行如下命令来生成私钥和对应的证书请求文件:
$ openssl req -new -keyout private.key -out for_request.csr
Generating a 1024 bit RSA private key
需要注意,用户自行生成私钥情况下,私钥文件一旦丢失,CA方由于不持有私钥信息,无法进行恢复,意味着通过该证书中公钥加密的内容将无法被解密。
用户证书的签发可以有两种方式。一般可以由CA直接来生成证书(内含公钥)和对应的私钥发给用户;也可以由用户自己生成公钥和私钥,然后由CA来对公钥内容进行签名。
后者情况下,用户一般会首先自行生成一个私钥和证书申请文件(Certificate Signing Request,即csr文件),该文件中包括了用户对应的公钥和一些基本信息,如通用名
(common name,即cn)、组织信息、地理位置等。CA只需要对证书请求文件进行签名,生成证书文件,颁发给用户即可。整个过程中,用户可以保持私钥信息的私密性,不会被其他方获知(包括CA方)。
生成证书申请文件的过程并不复杂,用户可以很容易地使用开源软件openssl来生成csr文件和对应的私钥文件。
例如,安装OpenSSL后可以执行如下命令来生成私钥和对应的证书请求文件:
$ openssl req -new -keyout private.key -out for_request.csr
Generating a 1024 bit RSA private key
需要注意,用户自行生成私钥情况下,私钥文件一旦丢失,CA方由于不持有私钥信息,无法进行恢复,意味着通过该证书中公钥加密的内容将无法被解密。
证书的撤销
证书超出有效期后会作废,用户也可以主动向CA申请撤销某证书文件。
由于CA无法强制收回已经颁发出去的数字证书,因此为了实现证书的作
废,往往还需要维护一个撤销证书列表(Certificate Revocation List,CRL),用于记录已经撤销的证书序号。
因此,通常情况下,当第三方对某个证书进行验证时,需要首先检查该证书是否在撤销列表中。如果存在,则该证书无法通过验证。如果不在,则继续进行后续的证书验证过程。
由于CA无法强制收回已经颁发出去的数字证书,因此为了实现证书的作
废,往往还需要维护一个撤销证书列表(Certificate Revocation List,CRL),用于记录已经撤销的证书序号。
因此,通常情况下,当第三方对某个证书进行验证时,需要首先检查该证书是否在撤销列表中。如果存在,则该证书无法通过验证。如果不在,则继续进行后续的证书验证过程。
hash散列算法
SHA256加密法
对于任意长度的消息,SHA256都会产生一个256bit长的哈希值,称作消息摘要。
这个摘要相当于是个长度为32个字节的数组,通常用一个长度为64的十六进制字符串来表示
这个摘要相当于是个长度为32个字节的数组,通常用一个长度为64的十六进制字符串来表示
具有强碰撞性
MD5
MD5即Message-Digest Algorithm 5(信息-摘要算法 5)
MD5一度被广泛应用于安全领域。但是由于MD5的弱点被不断发现以及计算机能力不断的提升,现在已经可以构造两个具有相同MD5的信息[2],使本算法不再适合当前的安全环境。MD5已被证明不具备“强抗碰撞性”。
SHA1
SHA-1在许多安全协议中广为使用,包括TLS和SSL、PGP、SSH、S/MIME和IPsec,曾被视为是MD5(更早之前被广为使用的散列函数)的后继者。
但SHA-1的安全性如今被密码学家严重质疑。已经被破解,被证明不具备“强抗碰撞性”,一般使用sha256以上
但SHA-1的安全性如今被密码学家严重质疑。已经被破解,被证明不具备“强抗碰撞性”,一般使用sha256以上
当前比较流行的哈希函数主要有128位的MD4和MD5和160位的SHA-1,今天介绍的SHA-2族有着更多位的输出哈希值,破解难度更大,能够提高更高的安全性。
SHA-2哈希加密算法
SHA-224、SHA-256、SHA-384,和SHA-512并称为SHA-2。
新的散列函数并没有接受像SHA-1一样的公众密码社区做详细的检验,所以它们的密码安全性还不被大家广泛的信任。
虽然至今尚未出现对SHA-2有效的攻击,它的算法跟SHA-1基本上仍然相似;因此有些人开始发展其他替代的散列算法。
新的散列函数并没有接受像SHA-1一样的公众密码社区做详细的检验,所以它们的密码安全性还不被大家广泛的信任。
虽然至今尚未出现对SHA-2有效的攻击,它的算法跟SHA-1基本上仍然相似;因此有些人开始发展其他替代的散列算法。
SHA-3哈希加密算法
SHA-3,之前名为Keccak算法,是一个加密杂凑算法。
SHA-3并不是要取代SHA-2,因为SHA-2目前并没有出现明显的弱点。
由于对MD5出现成功的破解,以及对SHA-0和SHA-1出现理论上破解的方法,NIST感觉需要一个与之前算法不同的,可替换的加密杂凑算法,也就是现在的SHA-3。
SHA-3并不是要取代SHA-2,因为SHA-2目前并没有出现明显的弱点。
由于对MD5出现成功的破解,以及对SHA-0和SHA-1出现理论上破解的方法,NIST感觉需要一个与之前算法不同的,可替换的加密杂凑算法,也就是现在的SHA-3。
RIPEMD-160哈希加密算法
RIPEMD-160 是一个 160 位加密哈希函数。
它旨在用于替代 128 位哈希函数 MD4、MD5 和 RIPEMD。
RIPEMD 是在 EU 项目 RIPE(RACE Integrity Primitives Evaluation,1988-1992)的框架中开发的。
它旨在用于替代 128 位哈希函数 MD4、MD5 和 RIPEMD。
RIPEMD 是在 EU 项目 RIPE(RACE Integrity Primitives Evaluation,1988-1992)的框架中开发的。
技术原理
Hash函数又称为哈希函数、散列函数、杂凑函数。它是一种单向密码体制,即一个从明文到密文的不可逆映射,
只有加密过程,没有解密过程。是一种单向的不可逆的加密算法.它对任意长度的输入消息,产生固定长度的输出,这个固定长度的输出称为原消息的散列值(Hash Value)或消息摘要(Message Digest).多用于网络传输过程验证数据的完整性。
只有加密过程,没有解密过程。是一种单向的不可逆的加密算法.它对任意长度的输入消息,产生固定长度的输出,这个固定长度的输出称为原消息的散列值(Hash Value)或消息摘要(Message Digest).多用于网络传输过程验证数据的完整性。
特点
易压缩
对于任意大小的输入x,Hash值H(x)的长度很小
易计算
对于任意给定的消息,计算其Hash值比较容易
单向性
对于给定的Hash值h,要找到m′使得H(m′)=h在计算上是不可行的,即求Hash的逆很困难
抗碰撞性(冲突避免)
很难找到两段内容不同的明文,使得它们的Hash值一致(发生碰撞)。
冲突避免有时候又称为“抗碰撞性”,分为“弱抗碰撞性”和“强抗碰撞性”。如果给定明文前提下,无法找到与之碰撞的其他明文,则算法具有“弱抗碰撞性”;如果无法找到任意两个发生Hash碰撞的明文,则称算法具有“强抗碰撞性”。
输入敏感
原始输入信息发生任何改变,新产生的Hash值都应该出现很大不同;
从比特位角度,指的是1比特位的输入变化会造成1/2的比特位发生变化
应用
数字摘要
数字摘要是对数字内容进行Hash运算,获取唯一的摘要值来指代原始完整的数字内容。数字摘要是Hash算法最重要的一个用途。利用Hash函数的抗碰撞性特点,数字摘要可以解决确保内容未被篡改过的问题。
总结
对称加密算法,速度快,安全性低,目前大量数据加密建议采用对称加密算法,提高加解密速度
非对称加密算法,速度较慢,安全性高,小量的机密数据,可以采用非对称加密算法。
hash散列算法 主要用于验证,防止信息被修.具体用途如:文件校验、数字签名、鉴权协议
实际工作中常用的方式是采用非对称加密算法管理对称算法的密钥,然后用对称加密算法加密数据,这样我们就集成了两类加密算法的优点,既实现了加密速度快的优点,又实现了安全方便管理密钥的优点。
非对称加密算法,速度较慢,安全性高,小量的机密数据,可以采用非对称加密算法。
hash散列算法 主要用于验证,防止信息被修.具体用途如:文件校验、数字签名、鉴权协议
实际工作中常用的方式是采用非对称加密算法管理对称算法的密钥,然后用对称加密算法加密数据,这样我们就集成了两类加密算法的优点,既实现了加密速度快的优点,又实现了安全方便管理密钥的优点。
应用
国密算法
定义
国密即国家密码局认定的国产密码算法,即商用密码。主要有SM1,SM2,SM3,SM4,SM7、SM9、祖冲之密码算法(ZUC)。密钥长度和分组长度均为128位。其中SM1、SM4、SM7、祖冲之密码(ZUC)是对称算法;SM2、SM9是非对称算法;SM3是哈希算法。其中SM1、SM7算法不公开,调用该算法时,需要通过加密芯片的接口进行调用
SM1 为对称加密。其加密强度与AES相当。该算法不公开,调用该算法时,需要通过加密芯片的接口进行调用。
SM2为非对称加密,基于ECC。该算法已公开。由于该算法基于ECC,故其签名速度与秘钥生成速度都快于RSA。ECC 256位(SM2采用的就是ECC 256位的一种)安全强度比RSA 2048位高,但运算速度快于RSA。
SM3 消息摘要。可以用MD5作为对比理解。该算法已公开。校验结果为256位。
SM4 无线局域网标准的分组数据算法。对称加密,密钥长度和分组长度均为128位。
SM2为非对称加密,基于ECC。该算法已公开。由于该算法基于ECC,故其签名速度与秘钥生成速度都快于RSA。ECC 256位(SM2采用的就是ECC 256位的一种)安全强度比RSA 2048位高,但运算速度快于RSA。
SM3 消息摘要。可以用MD5作为对比理解。该算法已公开。校验结果为256位。
SM4 无线局域网标准的分组数据算法。对称加密,密钥长度和分组长度均为128位。
SM1对称密码
SM1 算法是分组密码算法,分组长度为128位,密钥长度都为 128 比特,算法安全保密强度及相关软硬件实现性能与 AES 相当,算法不公开,仅以IP核的形式存在于芯片中。
采用该算法已经研制了系列芯片、智能IC卡、智能密码钥匙、加密卡、加密机等安全产品,广泛应用于电子政务、电子商务及国民经济的各个应用领域(包括国家政务通、警务通等重要领域)。
采用该算法已经研制了系列芯片、智能IC卡、智能密码钥匙、加密卡、加密机等安全产品,广泛应用于电子政务、电子商务及国民经济的各个应用领域(包括国家政务通、警务通等重要领域)。
SM2椭圆曲线公钥密码算法
SM2算法就是ECC椭圆曲线密码机制,但在签名、密钥交换方面不同于ECDSA、ECDH等国际标准,而是采取了更为安全的机制。另外,SM2推荐了一条256位的曲线作为标准曲线。
SM2标准包括总则,数字签名算法,密钥交换协议,公钥加密算法四个部分,并在每个部分的附录详细说明了实现的相关细节及示例。
SM2算法主要考虑素域Fp和F2m上的椭圆曲线,分别介绍了这两类域的表示,运算,以及域上的椭圆曲线的点的表示,运算和多倍点计算算法。然后介绍了编程语言中的数据转换,包括整数和字节串,字节串和比特串,域元素和比特串,域元素和整数,点和字节串之间的数据转换规则。
SM2标准包括总则,数字签名算法,密钥交换协议,公钥加密算法四个部分,并在每个部分的附录详细说明了实现的相关细节及示例。
SM2算法主要考虑素域Fp和F2m上的椭圆曲线,分别介绍了这两类域的表示,运算,以及域上的椭圆曲线的点的表示,运算和多倍点计算算法。然后介绍了编程语言中的数据转换,包括整数和字节串,字节串和比特串,域元素和比特串,域元素和整数,点和字节串之间的数据转换规则。
SM3杂凑算法
SM3密码杂凑(哈希、散列)算法给出了杂凑函数算法的计算方法和计算步骤,并给出了运算示例。此算法适用于商用密码应用中的数字签名和验证,消息认证码的生成与验证以及随机数的生成,可满足多种密码应用的安全需求。在SM2,SM9标准中使用。
此算法对输入长度小于2的64次方的比特消息,经过填充和迭代压缩,生成长度为256比特的杂凑值,其中使用了异或,模,模加,移位,与,或,非运算,由填充,迭代过程,消息扩展和压缩函数所构成。具体算法及运算示例见SM3标准。
此算法对输入长度小于2的64次方的比特消息,经过填充和迭代压缩,生成长度为256比特的杂凑值,其中使用了异或,模,模加,移位,与,或,非运算,由填充,迭代过程,消息扩展和压缩函数所构成。具体算法及运算示例见SM3标准。
SM4对称算法
此算法是一个分组算法,用于无线局域网产品。该算法的分组长度为128比特,密钥长度为128比特。加密算法与密钥扩展算法都采用32轮非线性迭代结构。解密算法与加密算法的结构相同,只是轮密钥的使用顺序相反,解密轮密钥是加密轮密钥的逆序。
此算法采用非线性迭代结构,每次迭代由一个轮函数给出,其中轮函数由一个非线性变换和线性变换复合而成,非线性变换由S盒所给出。其中rki为轮密钥,合成置换T组成轮函数。轮密钥的产生与上图流程类似,由加密密钥作为输入生成,轮函数中的线性变换不同,还有些参数的区别。SM4算法的具体描述和示例见SM4标准。
此算法采用非线性迭代结构,每次迭代由一个轮函数给出,其中轮函数由一个非线性变换和线性变换复合而成,非线性变换由S盒所给出。其中rki为轮密钥,合成置换T组成轮函数。轮密钥的产生与上图流程类似,由加密密钥作为输入生成,轮函数中的线性变换不同,还有些参数的区别。SM4算法的具体描述和示例见SM4标准。
SM7对称密码
SM7算法,是一种分组密码算法,分组长度为128比特,密钥长度为128比特。SM7适用于非接触式IC卡,应用包括身份识别类应用(门禁卡、工作证、参赛证),票务类应用(大型赛事门票、展会门票),支付与通卡类应用(积分消费卡、校园一卡通、企业一卡通等)。
SM9标识密码算法
为了降低公开密钥系统中密钥和证书管理的复杂性,以色列科学家、RSA算法发明人之一Adi Shamir在1984年提出了标识密码(Identity-Based Cryptography)的理念。标识密码将用户的标识(如邮件地址、手机号码、QQ号码等)作为公钥,省略了交换数字证书和公钥过程,使得安全系统变得易于部署和管理,非常适合端对端离线安全通讯、云端数据加密、基于属性加密、基于策略加密的各种场合。2008年标识密码算法正式获得国家密码管理局颁发的商密算法型号:SM9(商密九号算法),为我国标识密码技术的应用奠定了坚实的基础。
SM9算法不需要申请数字证书,适用于互联网应用的各种新兴应用的安全保障。如基于云技术的密码服务、电子邮件安全、智能终端保护、物联网安全、云存储安全等等。这些安全应用可采用手机号码或邮件地址作为公钥,实现数据加密、身份认证、通话加密、通道加密等安全应用,并具有使用方便,易于部署的特点,从而开启了普及密码算法的大门。
SM9算法不需要申请数字证书,适用于互联网应用的各种新兴应用的安全保障。如基于云技术的密码服务、电子邮件安全、智能终端保护、物联网安全、云存储安全等等。这些安全应用可采用手机号码或邮件地址作为公钥,实现数据加密、身份认证、通话加密、通道加密等安全应用,并具有使用方便,易于部署的特点,从而开启了普及密码算法的大门。
ZUC祖冲之算法
祖冲之序列密码算法是中国自主研究的流密码算法,是运用于移动通信4G网络中的国际标准密码算法,该算法包括祖冲之算法(ZUC)、加密算法(128-EEA3)和完整性算法(128-EIA3)三个部分。目前已有对ZUC算法的优化实现,有专门针对128-EEA3和128-EIA3的硬件实现与优化。
密码算法作为国家战略资源,比历史上任何时候都显得更为关键。在大数据和云计算的时代,关键信息往往通过数据挖掘技术在海量数据中获得,所以每一个人的信息保护都非常重要。
密码算法作为国家战略资源,比历史上任何时候都显得更为关键。在大数据和云计算的时代,关键信息往往通过数据挖掘技术在海量数据中获得,所以每一个人的信息保护都非常重要。
布隆过滤器
布隆过滤器布隆过滤器(Bloom Filter)于1970年由Burton Howard Bloom在论文《Space/Time Trade-offs in Hash Coding with Allowable Errors》中提出。布隆过滤器是一种基于Hash的高效
更高效的布隆过滤器
布隆过滤器采用了多个Hash函数来提高空间利用率。对同一个给定输入来说,多个Hash函数计算出多个地址,分别在位串的这些地址上标记为1。进行
查找时,进行同样的计算过程,并查看对应元素,如果都为1,则说明较大概率是存在该输入。
hash算法会误报存在,布隆过滤器会减少误报的存在。比如hash冲突,hash算法会把另一个不存在的误报存在,布隆过滤器多种hash算法,只要有一个为0就不存在了,减少了误报
无论是Hash算法,还是布隆过滤器,基本思想是一致的,都是基于内容的编址。Hash函数存在冲突,布隆过滤器也存在冲突。这就造成了两种方法都存在着误报(false positive)的情况,但绝对不会漏报(false negative)。
更高效的布隆过滤器
布隆过滤器采用了多个Hash函数来提高空间利用率。对同一个给定输入来说,多个Hash函数计算出多个地址,分别在位串的这些地址上标记为1。进行
查找时,进行同样的计算过程,并查看对应元素,如果都为1,则说明较大概率是存在该输入。
hash算法会误报存在,布隆过滤器会减少误报的存在。比如hash冲突,hash算法会把另一个不存在的误报存在,布隆过滤器多种hash算法,只要有一个为0就不存在了,减少了误报
无论是Hash算法,还是布隆过滤器,基本思想是一致的,都是基于内容的编址。Hash函数存在冲突,布隆过滤器也存在冲突。这就造成了两种方法都存在着误报(false positive)的情况,但绝对不会漏报(false negative)。
布隆过滤器可以联想到再散列法
同态加密
1.定义同态加密(homomorphic encryption)是一种特殊的加密方法,允许对密文进行处理得到仍然是加密的结果。即对密文直接进行处理,跟对明文进行处理后再对处理结果加密,得到的结果相同。从抽象代数的角度讲,保持了同态性。
同态性来自代数领域,一般包括四种类型:加法同态、乘法同态、减法同态和除法同态。同时满足加法同态和乘法同态,则意味着是代数同态,称为全同态(full homomorphic)。同时满足四种同态性,则称为算数同态。
对于计算机操作来讲,实现了全同态意味着对于所有处理都可以实现同态性。只能实现部分特定操作的同态性,称为特定同态(somewhat homomorphic)。
仅满足加法同态的算法包括Paillier和Benaloh算法;仅满足乘法同态的算法包括RSA和ElGamal算法。
同态加密在云计算和大数据的时代意义十分重大。目前,虽然云计算带来了包括低成本、高性能和便捷性等优势,但从安全角度讲,用户还不敢将敏感信息直接放到第三方云上进行处理。如果有了比较实用的同态加密技术,则大家就可以放心地使用各种云服务了,同时各种数据分析过程也不会泄露用户隐私。加密后的数据在第三方服务处理后得到加密后的结果,这个结果只有用户自身可以进行解密,整个过程第三方平台无法获知任何有效的数据信息。
对于计算机操作来讲,实现了全同态意味着对于所有处理都可以实现同态性。只能实现部分特定操作的同态性,称为特定同态(somewhat homomorphic)。
仅满足加法同态的算法包括Paillier和Benaloh算法;仅满足乘法同态的算法包括RSA和ElGamal算法。
同态加密在云计算和大数据的时代意义十分重大。目前,虽然云计算带来了包括低成本、高性能和便捷性等优势,但从安全角度讲,用户还不敢将敏感信息直接放到第三方云上进行处理。如果有了比较实用的同态加密技术,则大家就可以放心地使用各种云服务了,同时各种数据分析过程也不会泄露用户隐私。加密后的数据在第三方服务处理后得到加密后的结果,这个结果只有用户自身可以进行解密,整个过程第三方平台无法获知任何有效的数据信息。
另一方面,对于区块链技术,同态加密也是很好的互补。使用同态加密技术,运行在区块链上的智能合约可以处理密文,而无法获知真实数据,极大地提高了隐私安全性。
零知识证明(zero knowledge proof)
零知识证明(zero knowledge proof)是这样的一个过程,证明者在不向验证者提供任何额外信息的前提下,使验证者相信某个论断是正确的。
例如,Alice向Bob证明自己知道某个数字,在证明过程中Bob可以按照某个顺序提出问题(比如数字加上某些随机数后的变换)由Alice回答,并通过回答确信Alice较大概率确实知道某数字。证明过程中,Bob除了知道Alice确实知
道该数字外,自己无法获知或推理出任何额外信息(包括该数字本身),也无法用Alice的证明去向别人证明(Alice如果提前猜测出Bob问题的顺序,存在作假的可能性)。
例如,Alice向Bob证明自己知道某个数字,在证明过程中Bob可以按照某个顺序提出问题(比如数字加上某些随机数后的变换)由Alice回答,并通过回答确信Alice较大概率确实知道某数字。证明过程中,Bob除了知道Alice确实知
道该数字外,自己无法获知或推理出任何额外信息(包括该数字本身),也无法用Alice的证明去向别人证明(Alice如果提前猜测出Bob问题的顺序,存在作假的可能性)。
目前一般认为至少要满足三个条件:
·完整性(Completeness):真实的证明可以让验证者成功验证;
·可靠性(Soundness):虚假的证明无法让验证者保证通过验证,但允许存在小概率例外;
·零知识(Zero-Knowledge):如果得到证明,无法从证明过程中获知除了所证明信息之外的任何信息。
·完整性(Completeness):真实的证明可以让验证者成功验证;
·可靠性(Soundness):虚假的证明无法让验证者保证通过验证,但允许存在小概率例外;
·零知识(Zero-Knowledge):如果得到证明,无法从证明过程中获知除了所证明信息之外的任何信息。
量子密码学
量子密码学(quantum cryptography)随着量子计算和量子通信的研究而受到越来越多的关注,将会对已有的密码学安全机制产生较大的影响。
量子计算的概念最早是物理学家费曼于1981年提出,基本原理是利用量子比特可以同时处于多个相干叠加态,理论上可以同时用少量量子比特来表达大量的信息,并同时进行处理,大大提高计算速度。如1994年提出的基于量子计算的Shor算法,理论上可以实现远超经典计算速度的大数因子分解。这意味着大量加密算法包括RSA、DES、椭圆曲线算法等都将很容易被破解。但量子计算目前离实际可用的通用计算机还有一定距离。
量子通信则提供对密钥进行安全分发的机制,有望实现无条件安全的“一次性密码”。
量子计算的概念最早是物理学家费曼于1981年提出,基本原理是利用量子比特可以同时处于多个相干叠加态,理论上可以同时用少量量子比特来表达大量的信息,并同时进行处理,大大提高计算速度。如1994年提出的基于量子计算的Shor算法,理论上可以实现远超经典计算速度的大数因子分解。这意味着大量加密算法包括RSA、DES、椭圆曲线算法等都将很容易被破解。但量子计算目前离实际可用的通用计算机还有一定距离。
量子通信则提供对密钥进行安全分发的机制,有望实现无条件安全的“一次性密码”。
跨链技术
同构链跨链
同构链之间安全机制、共识算法、网络拓扑、区块生成验证逻辑都一致,它们之间的跨链交互相对简单
异构链跨链
构链的跨链交互相对复杂,比如比特币采用PoW算法而联盟链Fabric采用传统确定性共识算法,其区块的组成形式和确定性保证机制均有很大不同,直接跨链交互机制不易设计。异构链之间的跨链交互一般需要第三方辅助服务辅助跨链交互。
跨链实现方式
公证人机制(Notary schemes): 公证人也称见证人机制,公证人机制本质上是一种中介的方式。具体而言,假设区块链A和B本身是不能直接进行互操作的,那么他们可以引入一个共同信任的第三方作为中介,由这个共同信任的中介进行跨链消息的验证和转发。公证人机制的优点在于能够灵活地支持各种不同结构的区块链(前提是公证人能够访问相关方的链上信息),缺点在于存在中心化风险。
比如交易所
哈希锁定(Hash-locking): 哈希锁定技术主要是支持跨链中的原子资产交换,最早起源自比特币的闪电网络。其典型实现是哈希时间锁定合约HTLC(Hashed TimeLock Contract)。哈希锁定的原理是通过时间差和隐藏哈希值来达到资产的原子交换。哈希锁定只能做到交换而不能做到资产或者信息的转移,因此其使用场景有限。
原理
哈希时间锁定巧妙地采用了哈希锁和时间锁,迫使资产的接收方在deadline内确定收款并产生一种收款证明给打款人,否则资产会归还给打款人。收款证明能够被付款人用来获取接收人区块链上的等量价值的数量资产或触发其他事件。
比如
如下图所示,我们用一个例子来阐述如何使用哈希时间锁定进行跨链的原子资产交换,假设Alice和Bob有资产交换的需求,Alice想用1个BTC和Bob换20个ETH. 那么首先需要在两条链上设置哈希时间锁定合约,然后执行如下步骤:
- Alice 随机构建一个字符串s,并计算出其哈希 h = hash(s);
- Alice 将h发送给Bob的合约;
- Alice锁定自己的1个BTC资产,并设置一个较长的锁定时间t1, 并设置了获取该BTC的一个条件:谁能够提供h的原始值s就可以得到该BTC;
- Bob观察到Alice 合约中锁定了一个BTC, 然后Bob锁定自己的20个ETH资产,并设置一个相对较短的锁定时间t2, t2 < t1, Bob也设置了同样获取条件(谁提供h的原始值s就可以获取20个ETH);
- Alice将自己最初生成的字符串s 发送到Bob的合约里取得了20个ETH;
- Bob观察到步骤5中Alice的s值,将其发送给Alice的合约成功获取1个BTC; 至此Alice和Bob完成了资产的交换。
- 进行跨链资产交换的双方必须能够解析双方的合约内部数据,例如s,例如锁定资产的证明等;
- 哈希锁定的超时时间设置时需要保证存在时间差,这样在单方面作弊时另一方可以及时撤回自己的资产。
侧链/中继链(Sidechains / Relays): 侧链是指完全拥有某链的功能的另一条区块链,侧链可以读取和验证主链上的信息。主链不知道侧链的存在,由侧链主动感知主链信息并进行相应的动作。而中继链则是侧链和公证人机制的结合体,中继链具有访问需要和验证进行互操作的链的关键信息并对两条链的跨链消息进行转移。从这个角度看中继链也是一种去中心的公证人机制。
共识(分布式系统)
非拜占庭将军问题(无恶意节点)
paxos
达成一致阈值
可容忍消息丢失、延迟、乱序以及重复。它利用大多数 (Majority) 机制保证了2F+1的容错能力,即2F+1个节点的系统最多允许F个节点同时出现故障。
角色
提议者 (Proposer)
提案者:提出提案 (Proposal)。Proposal信息包括提案编号 (Proposal ID) 和提议的值 (Value)
决策者 (Acceptor)
参与决策,回应Proposers的提案。收到Proposal后可以接受提案,若Proposal获得多数Acceptors的接受,则称该Proposal被批准。
最终决策学习者 (Learner)
不参与决策,从Proposers/Acceptors学习最新达成一致的提案(Value)。
步骤
第一阶段:Prepare阶段。Proposer向Acceptors发出Prepare请求,Acceptors针对收到的Prepare请求进行Promise承诺。
Promise: Acceptors收到Prepare请求后,做出“两个承诺,一个应答”。
两个承诺:
不再接受Proposal ID小于等于(注意:这里是<= )当前请求的Prepare请求。
不再接受Proposal ID小于(注意:这里是< )当前请求的Propose请求。
一个应答:
不违背以前作出的承诺下,回复已经Accept过的提案中Proposal ID最大的那个提案的Value和Proposal ID,没有则返回空值。
两个承诺:
不再接受Proposal ID小于等于(注意:这里是<= )当前请求的Prepare请求。
不再接受Proposal ID小于(注意:这里是< )当前请求的Propose请求。
一个应答:
不违背以前作出的承诺下,回复已经Accept过的提案中Proposal ID最大的那个提案的Value和Proposal ID,没有则返回空值。
第二阶段:Accept阶段。Proposer收到多数Acceptors承诺的Promise后,向Acceptors发出Propose请求,Acceptors针对收到的Propose请求进行Accept处理。
第三阶段:Learn阶段。Proposer在收到多数Acceptors的Accept之后,标志着本次Accept成功,决议形成,将形成的决议发送给所有Learners。
活锁的问题
两个Proposers交替Prepare成功,而Accept失败,形成活锁(Livelock)
Multi-Paxos算法
Multi-Paxos允许有多个自认为是Leader的节点并发提交Proposal而不影响其安全性,这样的场景即退化为Basic Paxos。
Multi-Paxos首先需要选举Leader,Leader的确定也是一次决议的形成
没有Proposer竞争,解决了活锁问题。在系统中仅有一个Leader进行Value提交的情况下,Prepare阶段就可以跳过,从而将两阶段变为一阶段,提高效率
在 Chubby 中,主节点是通过执行 Basic Paxos 算法,进行投票选举产生的,并且
在运行过程中,主节点会通过不断续租的方式来延长租期(Lease)。比如在实际场景中,几天内都是同一个节点作为主节点。如果主节点故障了,那么其他的节点又会投票选举出新
的主节点,也就是说主节点是一直存在的,而且是唯一的。
其次,在 Chubby 中实现了兰伯特提到的,“当领导者处于稳定状态时,省掉准备阶段,
直接进入接受阶段”这个优化机制。
在运行过程中,主节点会通过不断续租的方式来延长租期(Lease)。比如在实际场景中,几天内都是同一个节点作为主节点。如果主节点故障了,那么其他的节点又会投票选举出新
的主节点,也就是说主节点是一直存在的,而且是唯一的。
其次,在 Chubby 中实现了兰伯特提到的,“当领导者处于稳定状态时,省掉准备阶段,
直接进入接受阶段”这个优化机制。
raft
角色
Leader
Candidate
Follower
倒计时器
每个节点上都有一个倒计时器 (Election Timeout),时间随机在 150ms 到 300ms 之间。有几种情况会重设 Timeout:
收到选举的请求
收到 Leader 的 Heartbeat
收到选举的请求
收到 Leader 的 Heartbeat
主要进行两个活动
选主 Leader Election
复制日志 Log Replication(同步数据)
复制日志 Log Replication(同步数据)
选leader流程
1.在一个节点倒计时结束 (Timeout) 后,这个节点的状态变成 Candidate 开始选举,它给其他几个节点发送选举请求 (RequestVote)
2.其他四个节点都返回成功,这个节点的状态由 Candidate 变成了 Leader,并在每个一小段时间后,就给所有的 Follower 发送一个 Heartbeat 以保持所有节点的状态,Follower 收到 Leader 的 Heartbeat 后重设 Timeout。
4个节点的选主过程和5个节点的类似,在选出一个新的 Leader 后,原来的 Leader 恢复了又重新加入了,这个时候怎么处理?在 Raft 里,第几轮选举是有记录的,重新加入的 Leader 是第一轮选举 (Term 1) 选出来的,而现在的 Leader 则是 Term 2,所有原来的 Leader 会自觉降级为 Follower
复制日志 Log Replication同步数据流程
一开始,Leader 和 两个 Follower 都没有任何数据
客户端发送请求给 Leader,储存数据 “sally”,Leader 先将数据写在本地日志,这时候数据还是 Uncommitted (还没最终确认,红色表示)
Leader 给两个 Follower 发送 AppendEntries 请求,数据在 Follower 上没有冲突,则将数据暂时写在本地日志,Follower 的数据也还是 Uncommitted。
Follower 将数据写到本地后,返回 OK。Leader 收到后成功返回,只要收到的成功的返回数量超过半数 (包含Leader),Leader 将数据 “sally” 的状态改成 Committed。( 这个时候 Leader 就可以返回给客户端了)
Leader 再次给 Follower 发送 AppendEntries 请求,收到请求后,Follower 将本地日志里 Uncommitted 数据改成 Committed。这样就完成了一整个复制日志的过程,三个节点的数据是一致的,
Raft 算法是现在分布式系统开发首选的共识算法,Raft 算法是通过一切以
领导者为准的方式,实现一系列值的共识和各节点日志的一致。
Raft 算法是强领导者模型,集群中只能有一个“霸道总裁”
领导者为准的方式,实现一系列值的共识和各节点日志的一致。
Raft 算法是强领导者模型,集群中只能有一个“霸道总裁”
单节点变更是利用“一次变更一个节点,不会同时存在旧配置和新配置 2 个‘大多
数’”的特性,实现成员变更。
因为联合共识实现起来复杂,不好实现,所以绝大多数 Raft 算法的实现,采用的都是单
节点变更的方法(比如 Etcd、Hashicorp Raft)。其中,Hashicorp Raft 单节点变更的
实现,是由 Raft 算法的作者迭戈·安加罗(Diego Ongaro)设计的,很有参考价值。
数’”的特性,实现成员变更。
因为联合共识实现起来复杂,不好实现,所以绝大多数 Raft 算法的实现,采用的都是单
节点变更的方法(比如 Etcd、Hashicorp Raft)。其中,Hashicorp Raft 单节点变更的
实现,是由 Raft 算法的作者迭戈·安加罗(Diego Ongaro)设计的,很有参考价值。
raft源码阅读
如何实现领导者选举?
领导者选举的入口函数 run(),在 raft.go 中以一个单独的协程运行,来实现节点状态
变迁,就像下面的样子:
你能看到,Follower(跟随者)、Candidate(候选人)、
Leader(领导者)三个节点状态对应的功能,都被抽象成一个函数,分别是
runFollower()、runCandidate() 和 runLeader()。
变迁,就像下面的样子:
你能看到,Follower(跟随者)、Candidate(候选人)、
Leader(领导者)三个节点状态对应的功能,都被抽象成一个函数,分别是
runFollower()、runCandidate() 和 runLeader()。
心跳超时步骤
1. 根据配置中的心跳超时时长,调用 randomTimeout() 函数来获取一个随机值,用以设
置心跳超时时间间隔。
2. 进入到 for 循环中,通过 select 实现多路 IO 复用,周期性地获取消息和处理。如果步
骤 1 中设置的心跳超时时间间隔发生了超时,执行步骤 3。
3. 如果等待心跳信息未超时,执行步骤 4,如果等待心跳信息超时,执行步骤 5。
4. 执行 continue 语句,开始一次新的 for 循环。
5. 设置节点状态为候选人,并退出 runFollower() 函数。
置心跳超时时间间隔。
2. 进入到 for 循环中,通过 select 实现多路 IO 复用,周期性地获取消息和处理。如果步
骤 1 中设置的心跳超时时间间隔发生了超时,执行步骤 3。
3. 如果等待心跳信息未超时,执行步骤 4,如果等待心跳信息超时,执行步骤 5。
4. 执行 continue 语句,开始一次新的 for 循环。
5. 设置节点状态为候选人,并退出 runFollower() 函数。
候选人选举步骤
1. 首先调用 electSelf() 发起选举,给自己投一张选票,并向其他节点发送请求投票 RPC 消
息,请求他们选举自己为领导者。然后调用 randomTimeout() 函数,获取一个随机
值,设置选举超时时间。
2. 进入到 for 循环中,通过 select 实现多路 IO 复用,周期性地获取消息和处理。如果发
生了选举超时,执行步骤 3,如果得到了投票信息,执行步骤 4。
3. 发现了选举超时,退出 runCandidate() 函数,然后再重新执行 runCandidate() 函数,
发起新一轮的选举。
4. 如果候选人在指定时间内赢得了大多数选票,那么候选人将当选为领导者,调用
setState() 函数,将自己的状态变更为领导者,并退出 runCandidate() 函数。
息,请求他们选举自己为领导者。然后调用 randomTimeout() 函数,获取一个随机
值,设置选举超时时间。
2. 进入到 for 循环中,通过 select 实现多路 IO 复用,周期性地获取消息和处理。如果发
生了选举超时,执行步骤 3,如果得到了投票信息,执行步骤 4。
3. 发现了选举超时,退出 runCandidate() 函数,然后再重新执行 runCandidate() 函数,
发起新一轮的选举。
4. 如果候选人在指定时间内赢得了大多数选票,那么候选人将当选为领导者,调用
setState() 函数,将自己的状态变更为领导者,并退出 runCandidate() 函数。
日志复制步骤
1. 调用 startStopReplication(),执行日志复制功能。
2. 然后启动新的协程,调用 replicate() 函数,执行日志复制功能。
3. 接着在 replicate() 函数中,启动一个新的协程,调用 heartbeat() 函数,执行心跳功
能。
4. 在 heartbeat() 函数中,周期性地发送心跳信息,通知其他节点,我是领导者,我还活
着,不需要你们发起新的选举。
2. 然后启动新的协程,调用 replicate() 函数,执行日志复制功能。
3. 接着在 replicate() 函数中,启动一个新的协程,调用 heartbeat() 函数,执行心跳功
能。
4. 在 heartbeat() 函数中,周期性地发送心跳信息,通知其他节点,我是领导者,我还活
着,不需要你们发起新的选举。
数据结构
节点状态相关的数据结构和函数,是在 state.go 中实现的。跟随者、候选人和领导者的 3
个状态,是由 RaftState 定义的,一个无符号 32 位的只读整型数值(uint32):
个状态,是由 RaftState 定义的,一个无符号 32 位的只读整型数值(uint32):
Hashicorp Raft(二):如何以“集群节点”为中心使用
API?
API?
如何创建 Raft 节点
在 Hashicorp Raft 中,你可以通过 NewRaft() 函数,来创建 Raft 节点。我强调一下,
NewRaft() 是非常核心的函数,是 Raft 节点的抽象实现
NewRaft() 是非常核心的函数,是 Raft 节点的抽象实现
第五个参数 SnapshotStore 存储的是快照信息,也就是压缩后的日志数据。在 Hashicorp
Raft 中提供了 3 种快照存储方式,它们分别是:
DiscardSnapshotStore(不存储,忽略快照,相当于 /dev/null,一般来说用于测
试);
FileSnapshotStore(文件持久化存储);
InmemSnapshotStore(内存存储,不持久化,重启程序后,数据会丢失)。
这 3 种方式,在生产环境中,建议你采用 FileSnapshotStore 实现快照, 使用文件持久
化存储,避免因程序重启,导致快照数据丢失。
Raft 中提供了 3 种快照存储方式,它们分别是:
DiscardSnapshotStore(不存储,忽略快照,相当于 /dev/null,一般来说用于测
试);
FileSnapshotStore(文件持久化存储);
InmemSnapshotStore(内存存储,不持久化,重启程序后,数据会丢失)。
这 3 种方式,在生产环境中,建议你采用 FileSnapshotStore 实现快照, 使用文件持久
化存储,避免因程序重启,导致快照数据丢失。
最后一个 Transport 指的是 Raft 集群内部节点之间的通信机制,节点之间需要通过这个通
道来进行日志同步、领导者选举等等。Hashicorp Raft 支持两种方式:
一种是基于 TCP 协议的 TCPTransport,可以跨机器跨网络通信的;
另一种是基于内存的 InmemTransport,不走网络,在内存里面通过 Channel 来通信。
在生产环境中,我建议你使用 TCPTransport,使用 TCP 进行网络通讯,突破单机限制,
提升集群的健壮性和容灾能力。
NewTCPTransport() 函数支持 5 个参数,也就是,指定创建连接需要的信息。比如,要绑
定的地址信息(raftBind、addr)、连接池的大小(maxPool)、超时时间(timeout),
以及日志输出的方式,一般而言,将日志输出到标准错误 IO 就可以了。
道来进行日志同步、领导者选举等等。Hashicorp Raft 支持两种方式:
一种是基于 TCP 协议的 TCPTransport,可以跨机器跨网络通信的;
另一种是基于内存的 InmemTransport,不走网络,在内存里面通过 Channel 来通信。
在生产环境中,我建议你使用 TCPTransport,使用 TCP 进行网络通讯,突破单机限制,
提升集群的健壮性和容灾能力。
NewTCPTransport() 函数支持 5 个参数,也就是,指定创建连接需要的信息。比如,要绑
定的地址信息(raftBind、addr)、连接池的大小(maxPool)、超时时间(timeout),
以及日志输出的方式,一般而言,将日志输出到标准错误 IO 就可以了。
如何增加集群节点
节点在启动的时候,可以通过向第一个节点ࢵ 发送加入集群的请求,然后加入到集群
中。具体来说,先启动的节点(也就是第一个节点)收到请求后,获取对方的地址(指
Raft 集群内部通信的 TCP 地址),然后调用 AddVoter() 把新节点加入到集群就可以了。
中。具体来说,先启动的节点(也就是第一个节点)收到请求后,获取对方的地址(指
Raft 集群内部通信的 TCP 地址),然后调用 AddVoter() 把新节点加入到集群就可以了。
如何移除集群节点
我们可以通过 RemoveServer() 函数来移除节点
如何查看集群节点状态
我们可以通过 Raft.Leader() 函数,查看当前领导者的地址信息,也可以通过 Raft.State()
函数,查看当前节点的状态,是跟随者、候选人,还是领导者。不过你要注意,
Raft.State() 函数返回的是 RaftState 格式的信息,也就是 32 位无符号整数,适合在代码
中使用。如果想在日志或命令行接口中查看节点状态信息,我建议你使用
RaftState.String() 函数,通过它,你可以查看字符串格式的当前节点状态。
函数,查看当前节点的状态,是跟随者、候选人,还是领导者。不过你要注意,
Raft.State() 函数返回的是 RaftState 格式的信息,也就是 32 位无符号整数,适合在代码
中使用。如果想在日志或命令行接口中查看节点状态信息,我建议你使用
RaftState.String() 函数,通过它,你可以查看字符串格式的当前节点状态。
总结
1. 除了提到的 raft-boltdb 做作为 LogStore 和 StableStore,也可以调用
NewInmemStore() 创建内存型存储,在测试时比较方便,重新执行程序进行测试时,
不需要手动清理数据存储。
2. 你还可以通过 NewInmemTransport() 函数,实现内存型通讯接口,在测试时比较方
便,将集群通过内存进行通讯,运行在一台机器上。
3. 你可以通过 Raft.Stats() 函数,查看集群的内部统计信息,比如节点状态、任期编号、节
点数等,这在调试或确认节点运行状况的时候很有用。
NewInmemStore() 创建内存型存储,在测试时比较方便,重新执行程序进行测试时,
不需要手动清理数据存储。
2. 你还可以通过 NewInmemTransport() 函数,实现内存型通讯接口,在测试时比较方
便,将集群通过内存进行通讯,运行在一台机器上。
3. 你可以通过 Raft.Stats() 函数,查看集群的内部统计信息,比如节点状态、任期编号、节
点数等,这在调试或确认节点运行状况的时候很有用。
为什么需要一致性?
- 数据不能存在单个节点(主机)上,否则可能出现单点故障。
- 多个节点(主机)需要保证具有相同的数据。
不考虑计算机之间互相发送恶意信息,极大简化了系统对容错的要求,最主要的是达到一致性
一致性的分类
强一致性
说明:保证系统改变提交以后立即改变集群的状态。
模型:
Paxos
Raft(muti-paxos)强领导模型
ZAB(muti-paxos)
模型:
Paxos
Raft(muti-paxos)强领导模型
ZAB(muti-paxos)
弱一致性
说明:也叫最终一致性,系统不保证改变提交以后立即改变集群的状态,但是随着时间的推移最终状态是一致的。
模型:
DNS系统
Gossip协议
模型:
DNS系统
Gossip协议
Gossip算法
说明:Gossip算法每个节点都是对等的,即没有角色之分。Gossip算法中的每个节点都会将数据改动告诉其他节点(类似传八卦)。有话说得好:"最多通过六个人你就能认识全世界任何一个陌生人",因此数据改动的消息很快就会传遍整个集群。
步骤:
1.集群启动,假设这里设置集群有20个节点
2. 某节点收到数据改动,并将改动传播给其他4个节点,传播路径表示为较粗的4条线
3. 收到数据改动的节点重复上面的过程直到所有的节点都被感染
1.集群启动,假设这里设置集群有20个节点
2. 某节点收到数据改动,并将改动传播给其他4个节点,传播路径表示为较粗的4条线
3. 收到数据改动的节点重复上面的过程直到所有的节点都被感染
Gossip 的三板斧
直接邮寄(Direct Mail)
直接邮寄:就是直接发送更新数据,当数据发送失败时,将数据缓存下来,然后重传。从图
中你可以看到,节点 A 直接将更新数据发送给了节点 B、D。
中你可以看到,节点 A 直接将更新数据发送给了节点 B、D。
直接邮寄虽然实现起来比较容易,数据同步也很及时,但可能会因为
缓存队列满了而丢数据。也就是说,只采用直接邮寄是无法实现最终一致性的,这一点我希
望你能注意到。
那如何实现最终一致性呢?答案就是反熵。本质上,反熵是一种通过异步修复实现最终一致
性的方法
缓存队列满了而丢数据。也就是说,只采用直接邮寄是无法实现最终一致性的,这一点我希
望你能注意到。
那如何实现最终一致性呢?答案就是反熵。本质上,反熵是一种通过异步修复实现最终一致
性的方法
反熵(Anti-entropy)
反熵指的是集群中的节点,每隔段时间就随机选择某个其他节点,然后通过互相交换自己的
所有数据来消除两者之间的差异,实现数据的最终一致性
所有数据来消除两者之间的差异,实现数据的最终一致性
其实,在实现反熵的时候,主要有推、拉和推拉三种方式。
推方式,就是将自己的所有副本数据,推给对方,修复对方副本中的熵:
推拉这个方式就很好理解了,这个方式就是同时修复自己副本和对方副
本中的熵:
本中的熵:
反熵中的熵
是指混乱程度,反熵就是指消除不同节点中数据的差异,提升节点间数据的相似度,降低熵
值。
另外需要你注意的是,因为反熵需要节点两两交换和比对自己所有的数据,执行反熵时通讯
成本会很高,所以我不建议你在实际场景中频繁执行反熵,并且可以通过引入校验和
(Checksum)等机制,降低需要对比的数据量和通讯消息等。
是指混乱程度,反熵就是指消除不同节点中数据的差异,提升节点间数据的相似度,降低熵
值。
另外需要你注意的是,因为反熵需要节点两两交换和比对自己所有的数据,执行反熵时通讯
成本会很高,所以我不建议你在实际场景中频繁执行反熵,并且可以通过引入校验和
(Checksum)等机制,降低需要对比的数据量和通讯消息等。
谣言传播(Rumor mongering)
谣言传播,广泛地散播谣言,它指的是当一个节点有了新数据后,这个节点变成活跃状态,
并周期性地联系其他节点向其发送新数据,直到所有的节点都存储了该新数据:
并周期性地联系其他节点向其发送新数据,直到所有的节点都存储了该新数据:
节点 A 向节点 B、D 发送新数据,节点 B 收到新数据后,变成活跃节
点,然后节点 B 向节点 C、D 发送新数据。其实,谣言传播非常具有传染性,它适合动态
变化的分布式系统。
点,然后节点 B 向节点 C、D 发送新数据。其实,谣言传播非常具有传染性,它适合动态
变化的分布式系统。
反熵的实现
反熵的目标是确保每个 DATA 节点拥有元信息指定的分片,而且不同节点上,同一分片组
中的分片都没有差异
中的分片都没有差异
数据缺失
缺失分片:
也就是说,在某个节点上整个分片都丢失了。
第一种情况修复起来不复杂,我们只需要将分片数据,通过 RPC 通讯,从其他节点上拷
贝过来就可以了:
贝过来就可以了:
节点之间的分片不一致:
节点上分片都存在,但里面的数据不一样,有数据
丢失的情况发生。
丢失的情况发生。
我们需要设计一个闭环
的流程,按照一个顺序修复,执行完流程后,也就是实现了一致性了
的流程,按照一个顺序修复,执行完流程后,也就是实现了一致性了
它是按照一定顺序来修复节点的数据差异,先随机选择一个节点,然后循环修复,每个节点
生成自己节点有、下一个节点没有的差异数据,发送给下一个节点,进行修复(为了方便演
示,假设 Shard1、Shard2 在各节点上是不一致的):
生成自己节点有、下一个节点没有的差异数据,发送给下一个节点,进行修复(为了方便演
示,假设 Shard1、Shard2 在各节点上是不一致的):
数据修复的起始节点为节点 A,数据修复是按照顺时针顺序,循环修复
的。需要你注意的是,最后节点 A 又对节点 B 的数据执行了一次数据修复操作,因为只有
这样,节点 C 有、节点 B 缺失的差异数据,才会同步到节点 B 上。
学到这里你可以看到,在实现反熵时,实现细节和最初算法的约定有些不同。比如,不是一
个节点不断随机选择另一个节点,来修复副本上的熵,而是设计了一个闭环的流程,一次修
复所有节点的副本数据不一致。
为什么这么设计呢?因为我们希望能在一个确定的时间范围内实现数据副本的最终一致性,
而不是基于随机性的概率,在一个不确定的时间范围内实现数据副本的最终一致性。
这样做能减少数据不一致对监控视图影响的时长。而我希望你能注意到,技术是要活学活用
的,要能根据场景特点权衡妥协,设计出最适合这个场景的系统功能。最后需要你注意的
是,因为反熵需要做一致性对比,很消耗系统性能,所以建议你将是否启用反熵功能、执行
一致性检测的时间间隔等,做成可配置的,能在不同场景中按需使用。
的。需要你注意的是,最后节点 A 又对节点 B 的数据执行了一次数据修复操作,因为只有
这样,节点 C 有、节点 B 缺失的差异数据,才会同步到节点 B 上。
学到这里你可以看到,在实现反熵时,实现细节和最初算法的约定有些不同。比如,不是一
个节点不断随机选择另一个节点,来修复副本上的熵,而是设计了一个闭环的流程,一次修
复所有节点的副本数据不一致。
为什么这么设计呢?因为我们希望能在一个确定的时间范围内实现数据副本的最终一致性,
而不是基于随机性的概率,在一个不确定的时间范围内实现数据副本的最终一致性。
这样做能减少数据不一致对监控视图影响的时长。而我希望你能注意到,技术是要活学活用
的,要能根据场景特点权衡妥协,设计出最适合这个场景的系统功能。最后需要你注意的
是,因为反熵需要做一致性对比,很消耗系统性能,所以建议你将是否启用反熵功能、执行
一致性检测的时间间隔等,做成可配置的,能在不同场景中按需使用。
EPaxos
ZAB算法
说明:ZAB也是对Multi Paxos算法的改进,大部分和raft相同
和raft算法的主要区别:
对于Leader的任期,raft叫做term,而ZAB叫做epoch
在状态复制的过程中,raft的心跳从Leader向Follower发送,而ZAB则相反。
和raft算法的主要区别:
对于Leader的任期,raft叫做term,而ZAB叫做epoch
在状态复制的过程中,raft的心跳从Leader向Follower发送,而ZAB则相反。
ZooKeeperAtomic Broadcast ( ZAB, ZooKeeper原子消息广播协议)
ZAB协议:如何实现操作的顺序性?
为什么 Multi-Paxos 无法实现操作顺序性?
兰伯特的 Multi-Paxos 解决的是一系列值如何达成共识的问题,它关心的是,对于指定序号的位置,最多只有一个指令(Command)会被选定,但它不关心选定的是哪个指令,也
就是说,它不关心指令的顺序性(也就是操作的顺序性)。
就是说,它不关心指令的顺序性(也就是操作的顺序性)。
什么是状态机?
本质上来说,状态机指的是有限状态机,它是一个数学模型。你可以这么理解:状态机是一
个功能模块,用来处理一系列请求,最大的特点就是确定性,也就是说,对于相同的输入,
不管重复运行多少次,最终的内部状态和输出都是相同的。
个功能模块,用来处理一系列请求,最大的特点就是确定性,也就是说,对于相同的输入,
不管重复运行多少次,最终的内部状态和输出都是相同的。
Multi-Paxos、Raft 都是共识算法,而共识算法是就一系列值达成共识的,达成
共识后,这个值就不能改了。但有时候我们是需要更改数据的值的,比如 KV 存储,我们肯
定需要更改指定 key(比如 X)对应的值,这时我们就可以通过状态机来解决这个问题。
共识后,这个值就不能改了。但有时候我们是需要更改数据的值的,比如 KV 存储,我们肯
定需要更改指定 key(比如 X)对应的值,这时我们就可以通过状态机来解决这个问题。
ZAB 实现了主备模式,也就是所有的数据都以主节点为准
ZAB 实现了 FIFO 队列,保证消息处理的顺序性。
ZAB 还实现了当主节点崩溃后,只有日志最完备的节点才能当选主节点,因为日志
最完备的节点包含了所有已经提交的日志,所以这样就能保证提交的日志不会再改变。
最完备的节点包含了所有已经提交的日志,所以这样就能保证提交的日志不会再改变。
,这些特性好像和 Raft 很像。是的,因为在前面几讲,我们
已经学习了 Raft 算法,所以你可以类比 Raft 来理解,在 Raft 中:
所有日志以领导者的为准;
领导者接收到客户端请求后,会基于请求中的指令,创建日志项,并将日志项缓存在本
地,然后按照顺序,复制到其他节点和提交 ;
在 Raft 中,也是日志最完备的节点才能当选领导者。
已经学习了 Raft 算法,所以你可以类比 Raft 来理解,在 Raft 中:
所有日志以领导者的为准;
领导者接收到客户端请求后,会基于请求中的指令,创建日志项,并将日志项缓存在本
地,然后按照顺序,复制到其他节点和提交 ;
在 Raft 中,也是日志最完备的节点才能当选领导者。
CAP理论
在一个分布式系统中,由于节点故障、网络延迟等各种原因,根据CAP理论,我们只能保证一致性(Consistency)、可用性(Availability)、分区容错性(Partition Tolerance)中的两个
拜占庭将军问题(有恶意节点)
pbft
实用拜占庭容错算法PBFT(Practical Byzantine Fault Tolerance)
阈值
PBFT算法的核心理论是n>=3f+1
n是系统中的总节点数,f是允许出现故障的节点数
n是系统中的总节点数,f是允许出现故障的节点数
角色
client:请求(request)自愿者,上例中指总司令。
replica:副本,所有参与提供服务的节点,上例指军长和师长
primary:承担起提供服务主要职责的节点,上例是军长
backup:其他副本,但相对于primary角色。上例指师长。
replica:副本,所有参与提供服务的节点,上例指军长和师长
primary:承担起提供服务主要职责的节点,上例是军长
backup:其他副本,但相对于primary角色。上例指师长。
流程
pre-prepare:primary收到请求,生成新区块并广播
prepare:所有replica收到区块后,广播区块验证结果,同时等待接收超过2/3的节点的广播
commit:收到2/3的节点广播或者超时后,再次发送广播,同时再次等待接收超过2/3的节点的广播
这里的逻辑有点绕:
第一次等待超过2/3的节点广播,是为了确认“已经有超过2/3的节点收到区块了”。但是这只是你自己知道,别人并不知道啊,因此需要再发送一次广播,告诉别的节点“我已经确认有超过2/3的节点收到区块啦”。而第二次等待超过2/3的节点广播,则是为了确认“已经有超过2/3的节点确认(有超过2/3的节点收到区块啦)”,此时说明已经达成共识,可以把该区块写到链上了。
回复(reply):结果反馈。
prepare:所有replica收到区块后,广播区块验证结果,同时等待接收超过2/3的节点的广播
commit:收到2/3的节点广播或者超时后,再次发送广播,同时再次等待接收超过2/3的节点的广播
这里的逻辑有点绕:
第一次等待超过2/3的节点广播,是为了确认“已经有超过2/3的节点收到区块了”。但是这只是你自己知道,别人并不知道啊,因此需要再发送一次广播,告诉别的节点“我已经确认有超过2/3的节点收到区块啦”。而第二次等待超过2/3的节点广播,则是为了确认“已经有超过2/3的节点确认(有超过2/3的节点收到区块啦)”,此时说明已经达成共识,可以把该区块写到链上了。
回复(reply):结果反馈。
pow
PoW算法:有办法黑比特币吗?
在区块链中是通过对区块头执行 SHA256 哈希运算,得到小于目标
值的哈希值,来证明自己的工作量的。
值的哈希值,来证明自己的工作量的。
需要你注意的是,即使攻击者只有 30% 的算力,他也有可能连续计算出多个区块的哈希
值,挖掘出更长的攻击链,发动攻击; 另外,即使攻击者拥有 51% 的算力,他也有可能半
天无法计算出一个区块的哈希值,也就是攻击失败。也就是说,能否计算出符合条件的哈希
值,有一定的概率性,但长久来看,攻击者攻击成功的概率等同于攻击者算力的权重。
值,挖掘出更长的攻击链,发动攻击; 另外,即使攻击者拥有 51% 的算力,他也有可能半
天无法计算出一个区块的哈希值,也就是攻击失败。也就是说,能否计算出符合条件的哈希
值,有一定的概率性,但长久来看,攻击者攻击成功的概率等同于攻击者算力的权重。
pos
分布式架构会遭遇到以下问题:
1、异构环境的分布式架构首先可能遇到网络传输问题,比如数据丢失、延迟、重复、乱序。(无恶意节点)
2、欺骗攻击和重播攻击(有恶意节点)
3、操纵多个失效节点,延迟通讯,制造混乱。(有恶意节点)
1、异构环境的分布式架构首先可能遇到网络传输问题,比如数据丢失、延迟、重复、乱序。(无恶意节点)
2、欺骗攻击和重播攻击(有恶意节点)
3、操纵多个失效节点,延迟通讯,制造混乱。(有恶意节点)
虚拟机智能合约
ETH EVM (基于栈的图灵完备虚拟机)
solidity (一种融合了c/c++/go语言风格的智能合约高级语言)
EOS WASM (内置了WebAssembly的一个基于堆栈的虚拟机)
wasm学习
什么是wasm
WebAssembly(WASM)是一种新的编码方式,它是一种低级的类汇编语言,wasm 是体积小且加载快的二进制格式,
并为诸如 C/C++/Rust 等语言提供一个编译目标,以便它们可以在 Web 上运行
并为诸如 C/C++/Rust 等语言提供一个编译目标,以便它们可以在 Web 上运行
特点
Fabric Hyperledger Burrow
java Burrow是一种从以太坊衍生出来的代码库,灵感来自于Monax在2014年开发和开源的一种叫做eris-db的技术。该项目由英特尔和Monax提出,为商业公司和组织提供了一个智能合约平台。其主要由Monax贡献,并由Monax 和英特尔赞助。
本体 neovm和wasmvm,neovm是go语言实现的翻版以太坊虚拟机。
wasm是用的wagon(a WebAssembly-based interpreter in Go)
wasm是用的wagon(a WebAssembly-based interpreter in Go)
Ontology智能合约现包含2种类型的合约:Native合约和NeoVm合约。Native合约是在Ontology底层直接编写的合约,不需要像部署普通合约那样编写合约代码,具有很高的执行效率,是对普通合约的极大优化,通用的服务包括:Oracle,DID,权限管理,数据交易所都将采用Native合约实现。NeoVm合约是采用NeoVm虚拟机运行的合约,需要编写相应的合约代码,现支持的语言包含:Java,C#,Python,NeoVm本身具有轻量级、可扩展、高性能的特性,通过结合Interop Service层能很好的打通虚拟机与账本层间的交互。
什么是虚拟机VM
虚拟机就是一个完全独立的沙盒,合约代码可对外完全隔离,并在虚拟机内部运行,运行在虚拟机内部的代码,不能接触到网络,文件系统或者其它进程。
其主要作用是处理区块链的智能合约,使使用高级编程语言开发的智能合约可以独立运行于虚拟机上。
其主要作用是处理区块链的智能合约,使使用高级编程语言开发的智能合约可以独立运行于虚拟机上。
为什么要沙箱(盒)呢?
避免编写恶意的智能合约的代码,部署到区块链网络中,轻则出现资产被盗等情况,严重的话,完全可以造成整个区块链网络的崩溃,造成毁灭性的打击。同时,虚拟机有有效隔离了合约代码编写错误导致的整个系统失败
区块链虚拟机与传统虚拟机的异同点
相同点
都运行在封闭的沙箱环境,同宿主机的网络,文件系统,进程隔离
异同点
传统虚拟机是一个较为完备的计算机系统,区块链虚拟机更接近于一个代码的运行环境,更加轻量
wasm基本原理与执行过程
解释执行
1.编译
c++/js源码编译成wast指令描述文件
2.解释执行环境
IR解释执行
编译执行
1.编译
c++/js源码编译成wast指令描述文件
2.生成wasm字节码文件
3.编译环境执行
IR编译执行
执行过程
1. wasm文件在执行时,会被先加载到VM里,加载过程中会进行解析,以得到诸如可访问函数信息等
2. 加载wasm文件时,每个函数都会被解码成标准的码流串,比如add函数, “32 1 0 0 0 32 0 0 0 0 106 1”,那么code就就保存了该码流,相当于是这个函数的实现
1、在执行add函数前的上下文初始化中,已将a和b这两个入参放到local中;
2、这里的两个32指令,也就是wast里的get_local指令,就是从local里将这两个值取出来push到stack里,其中两个32后面的“1 0 0 0” 和”0 0 0 0“分别是两个值的位置索引,只是用32字节长度来表示。
3、然后106指令,也就是i32.add指令,指行加法运算,并将a和b从stack里POP出来,将a+b结果push到stack里。
2、这里的两个32指令,也就是wast里的get_local指令,就是从local里将这两个值取出来push到stack里,其中两个32后面的“1 0 0 0” 和”0 0 0 0“分别是两个值的位置索引,只是用32字节长度来表示。
3、然后106指令,也就是i32.add指令,指行加法运算,并将a和b从stack里POP出来,将a+b结果push到stack里。
JIT技术Just-In-Time Compiler
定义
一种动态编译中间代码的方式,根据需要,在程序中编
译并执行生成的机器码,能够大幅提升动态语言的执行速度
译并执行生成的机器码,能够大幅提升动态语言的执行速度
实现原理
将原来编译器要生成机器码的部分要直接写
入到当前的内存中,然后通过函数指针的转换,找到对应的机器码并进行执行
入到当前的内存中,然后通过函数指针的转换,找到对应的机器码并进行执行
持久化内存
在EOS中每个action执行的时候都会重新的申请一块新的内存,每个action上下文中的变量是
私有的,即使在同一个transaction中的action,他们的变量也是不可以共享,唯一的一种方式
来共享变量就是通过持久化数据到EOS的数据库中,这些可以通过EOSIO的持久化API来实现。
私有的,即使在同一个transaction中的action,他们的变量也是不可以共享,唯一的一种方式
来共享变量就是通过持久化数据到EOS的数据库中,这些可以通过EOSIO的持久化API来实现。
WAVM是将wasm或者wast文件转化为LLVM的IR表示,然后通过LLVM运行代码来实现
wasm
https://www.w3ctech.com/topic/2027 WebAssembly 系列
wasm虚拟机运行原理
借助llvm jit引擎
JIT引擎的工作原理并没有那么复杂,本质上是将原来编译器要生成机器码的部分要直接写
入到当前的内存中,然后通过函数指针的转换,找到对应的机器码并进行执行
入到当前的内存中,然后通过函数指针的转换,找到对应的机器码并进行执行
实现原理
将wasm转化为LLVM能识别的IR中间语言。
借助LLVM-JIT技术来实现IR的语言的运行。
借助LLVM-JIT技术来实现IR的语言的运行。
区块链证书管理体系
区块链中大量使用了现代信息安全和密码学的技术成果,主要包括:哈希算法、对称加密、非对称加密、数字签名、数字证书等。哈希算法解决了信息完整性验证问题,对称算法提高了加密运算效率,非对称算法解决了对称密钥传递问题,数字证书则为公钥所有者背书,解决了公钥持有者的证明问题,PKI/CA体系形成了解决信息安全、信息机密性、完整性和抗抵赖的完整解决方案。
公钥基础设施(Public Key Infrastructure,简称PKI)
包含内容
PKI系统包括证书机构CA(Certificate Of Authority,认证中心)、注册机构RA和相应的PKI存储库。
CA用于签发并管理证书;RA可作为CA的一部分,也可以独立,其功能包括个人身份审核、CRL管理、密钥产生和密钥对备份等;PKI存储库包括LDAP(Lightweight Directory Access Protocol,轻量目录访问协议)目录服务器和普通数据库,用于对用户申请、证书、密钥、CRL(Certificate revocation lists)和日志等信息进行存储和管理,并提供一定的查询功能。
CA用于签发并管理证书;RA可作为CA的一部分,也可以独立,其功能包括个人身份审核、CRL管理、密钥产生和密钥对备份等;PKI存储库包括LDAP(Lightweight Directory Access Protocol,轻量目录访问协议)目录服务器和普通数据库,用于对用户申请、证书、密钥、CRL(Certificate revocation lists)和日志等信息进行存储和管理,并提供一定的查询功能。
证书申请过程
用户申请:
用户生成自己的公钥和私钥,将公钥和自己的身份信息提交给安全服务器,安全服务器将用户的申请信息传送给RA服务器。
RA审核:
用户向RA证明自己的身份,RA收到用户的申请后进行核对。如果RA同意用户申请证书的请求,则对证书申请信息做数字签名;否则拒绝用户的申请。
CA发行证书:
RA将用户申请和RA签名传输给CA,CA对RA数字签名做认证,如果验证通过,则同意用户请求,颁发证书,然后将证书输出。如果验证不通过,则拒绝证书申请。
RA转发证书
RA从CA得到新的证书,首先将证书输出到LDAP服务器以提供目录浏览,再通知用户证书发行成功,告知证书序列号,到指定的网址去下载证书。
用户证书获取
用户使用证书序列号去指定网址下载自己的数字证书。
X.509证书格式
主流的证书格式为X.509格式。X.509标准规定了证书可以包含什么信息,并说明了记录信息的方法。
X.509结构中包括版本号(Version Number)、序列号(Serial Number)、签名算法(Signature Algorithm)、颁布者(Issuer)、有效期(Validity)、主体(Subject)、主体公钥信息(Subject Public Key Info)、主体公钥算法(Public Key Algorithm)、主体公钥(Subject Public Key)、证书签名算法(Certificate Signature Algorithm)和证书签名(Certificate Signature)。
X.509结构中包括版本号(Version Number)、序列号(Serial Number)、签名算法(Signature Algorithm)、颁布者(Issuer)、有效期(Validity)、主体(Subject)、主体公钥信息(Subject Public Key Info)、主体公钥算法(Public Key Algorithm)、主体公钥(Subject Public Key)、证书签名算法(Certificate Signature Algorithm)和证书签名(Certificate Signature)。
证书验证原理
链化未来证书管理体系
0 条评论
下一页