自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(26)
  • 收藏
  • 关注

原创 POS代码实现

创建一条区块链func create() { // 生成创世块 genesisBlock := common.Block{} genesisBlock = common.Block{ 0, time.Now().String(), "", GenerateHashValue(genesisBlock), "", common.Validator{}, } // 获取bolt数据库句柄 db := common.GetDB() defer db.Close() //

2022-02-10 09:22:06 11038

原创 DPOS代码实现

创建一个区块链func NewBlockchain() { // 初始化数据库 setupDB() db := common.GetDB() defer db.Close() // 获取最后一个区块的哈希 var lastBlockHash []byte err := db.Update(func(tx *bolt.Tx) error { bucket := tx.Bucket([]byte(common.BlocksBucket)) lastBlockHash = bucket

2022-02-10 09:21:54 12398 2

原创 PBFT代码实现

客户端var clientCmd = &cobra.Command{ Use: "client", Short: "client manage", Run: func(cmd *cobra.Command, args []string) { // 获取客户端的端口 port, err := cmd.Flags().GetInt("port") if err != nil { log.Println("get param error: ", err) } // 客户端

2022-02-10 09:21:39 3669 5

原创 共识算法学习总结

1. 分布式系统简介1.1 什么是分布式系统分布式系统(distributed system)是建立在网络上的软件系统。在一个分布式系统中,一组独立的计算机展现给用户的是一个统一的整体,就好像是一个系统。系统拥有多种通用的物理和逻辑资源,可以动态的分配任务。分散的物理和逻辑资源通过计算机网络实现信息交换。通常,对用户来说,分布式系统只有一个模型或范型。在操作系统之上有一层软件中间件负责实现这个模型。一个著名的分布式系统的例子是万维网。1.2 分布式系统应具备的能力分布式系统作为一个逻辑整体,不应该

2022-02-10 09:14:04 3760 7

原创 单向散列函数及案例

1. 概述单向散列函数(one-way hash function),又称单向Hash函数、杂凑函数。有一个输入和一个输出,输入的数据称为消息(message),输出的数据称为散列值(hash value)。单向散列函数可以根据消息的内容计算出散列值,而散列值可以被用来检验消息的完整性等。1.1 单向散列函数的性质根据任意长度的消息计算出固定长度的散列值消息不同散列值也不同,又称抗碰撞性无法或很难通过散列值计算的到消息,又称单向性1.2 单向散列函数的应用检测软件是否被篡改:如果软件被篡

2021-11-05 21:37:33 696

原创 非对称加密及案例

1. 概述对称加密算法在加密时使用的是同一个密钥,为了解决信息公开传送和密钥管理的问题,于是提出了一种新的密钥交换协议,这种协议允许在不安全的媒体上的通讯双方交换信息、安全地达成一致的密钥,这就是非对称加密(公钥加密)。之所以称为非对称加密,是因为使用非对称加密算法时,加密和解密的使用的是不同的密钥。这两个密钥分别是私钥(private key)和公钥(public key)。常用的非对称加密算法有:RSA、ECDSA2. 特点使用公钥加密后,只有对应的私钥才能解密使用私钥加密后,只有对应的公钥

2021-11-02 14:43:08 2444

原创 对称密码及案例

1. 概述1.1概念根据密钥的使用方式,可以将密码分为对称密码和非对称密码(公钥密码)。对称密码(symmetric cryptography)是指在加密和解密时使用同一密钥的方式。而公钥密码(public key cryptography)则是在加密和解密时使用不同的密钥。常用的对称密码有:DES、3DES、AES等等。1.2 特性加密和解密使用同一个密钥加密和解密速度较快,适合加密比较大的数据密钥传递的过程不安全,而且容易被破解,密钥管理也比较麻烦2. DES2.1 介绍DES

2021-10-29 15:24:55 4939

原创 古典密码学总结及代码实现

1. 概述虽然用近代密码学的观点来看,许多古典密码是很不安全的。但是许多编制古典密码学的基本方法对于编制现代密码学仍有效果。其中主要的方法有:置换方法、代替方法2. 置换方法把明文中的字母重新排列,字母本身不变,但其位置改变了,这样编成的密码称为置换密码。2.1 倒序加密最简单的置换密码是把明文中的字母顺序倒过来,然后截成固定长度的字母组成密文。// 置换倒序加密func reverseOrder(plainText string) string { var cipherText strin

2021-10-24 19:48:35 1871

原创 Go语言数据结构与算法—哈希表

1. 概述哈希表(Hash table),也称为散列表。是根据关键码值而直接进行访问的数据结构。也就是说,它通过关键码值映射到表中一个位置来访问记录,以加快查找的速度。可以用取快递做一个例子:哈希表相当于快递柜,而关键码值就相当于取件码。通过取件码可以很快的找到自己的快递。1.1 术语散列方法:选取某个函数,以该函数按关键字计算元素的存储位置,并按此存放。散列函数(哈希函数):散列方法中使用的转换函数。散列表:按散列方法构造的表就是散列表。冲突:不同关键码映射到同一个散列地址。同义词:具有

2021-10-22 11:30:22 307

原创 Go语言数据结构与算法—栈

概述栈(stack)是一种先进后出(First In Last Out, FILO)的特殊线性表,其插入和删除操作只允许在线性表的一段进行。允许操作的一端称为栈顶(top),不允许操作的一端称为栈底(bottom)。栈中插入元素的操作称为入栈(push),删除元素的操作称为出栈(pop)。常用的应用场景:子程序的调用:在跳往子程序前,会先将下个指令的地址存到堆栈中,直到子程序执行完后再将地址取出,以回到原来的程序中处理递归调用:和子程序的调用类似,只是除了存储下一个指令的地址外,也将参数、区域变量

2021-10-21 16:59:59 317

原创 Go语言数据结构与算法—常用排序算法

概述所谓的排序算法,就是通过特定的算法因式将一组或多组数据按照既定模式进行重新排序。这种新序列遵循着一定的规则,体现出一定的规律。因此,经过处理后的数据便于筛选和计算,大大提升了计算效率。分类插入排序插入排序(insertion sort)算法的思路是:每次将一个元素,按其关键字值的大小,插入前面已经排序的子序列,以此重复,直达插入全部元素。插入排序算法有:直接插入排序、二分插入排序、希尔排序交换排序交换排序算法的思路是:比较两个元素大小,如果反序,则交换交换排序算法有:冒泡排序、快速排序

2021-10-21 16:01:55 258

原创 Go数据结构与算法—链表

介绍链表是一种物理存储单元上的非连续、非顺序的存储结构。链表由一系列节点(链表中的每一个元素)组成。节点可以在运行时动态生成。每个节点包括两个部分:存储数据元素的数据域、存储下一个节点的指针域。 相比于线性表的顺序结构,链表操作复杂。但是由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而线性表和顺序表相应的时间复杂度分别是O(logn)和O(1)。单链表type HeroNode struct {

2021-10-17 16:45:00 145

原创 Go数据结构与算法—队列

介绍队列(queue),是一种特殊的线性表。队列只允许在一端插入数据,另一端取出数据,并且队列中的数据遵循先进先出(First In First Our, FIFO)的规则。其中取出数据的一端称为队头,插入数据的一端称为队尾。队列可以分为:顺序队列、循环队列、链式队列。顺序队列type Queue struct { MaxSize int Front int Rear int Element []int}// 初始化队列func (q *Queue) initQueue(m

2021-10-16 00:20:05 500

原创 Go语言数据结构—稀疏数组

介绍如果一个数组中非零个数远远小于数组元素个数,且非零元素分布没有规律,当这样的数组进行存储时,因为很多元素都是为0的,直接存储的话,会浪费掉很多空间。这时候可以数组转化为稀疏数组,然后进行存储。那么怎么进行转换呢? {0, 1, 0, 0, 0}, {1, 0, 0, 0, 0}, {0, 0, 1, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 1}, 以行上面这个数组为例: 1. 首先记录数组的行、列、几个非零的元素(row、col、value)

2021-10-14 14:00:08 154

原创 ERC20与ERC721标准及案例

ERC-20ERC-20简介数字加密货币可以分为原生币和代币(token)。ERC(Etherum Request for Comments)是以太坊开发者针对代币提交的协议提案,而20表示的是协议的编号。所有符合ERC-20标准的代币都能立即兼容以太坊钱包,并且降低了token的开发门槛,只要实现ERC-20协议就可以快速开发出一种新的token。除此之外,通过实现ERC标准还增加了合约之间的互操作性、token的安全性。但是ERC-20也有着一些缺陷,比如:发布后不能修改合约、如果向合约中发送的不是

2021-09-10 00:41:55 10529 3

原创 Hyperledger fabric 基础知识总结

hyperledger fabric项目概述Hyperledger,中文名为超级账本。是Linux基金会于2015年发起的推进区块链数字技术和交易验证的开源项目。Hyperledger的目标是让成员共同合作、共建开放平台以满足来自多个不同行业各种用户的需求,同时能大大简化业务流程。随着hyperledger项目的不断扩大,单一的项目无法满足业务的需求,因此hyperledger逐步由一个单一的项目发展成一个项目组。而hyperledger fabric就是其中一个项目。hyperledger项目组主要的

2021-09-08 13:00:32 14028

原创 go Cobra命令行工具总结

简介Cobra是一个用Go语言实现的命令行工具。并且现在正在被很多项目使用,例如:Kubernetes,、Hugo和Github CLI等。通过使用Cobra,不仅可以快速的创建命令行界面,也可以快速开发基于Cobra的应用程序。基本概念Cobra由三部分组成:命令(Commands )、参数(Args)和标志(Flags)。命令(Commands):代表行为。命令是程序的中心点,程序的每个功能都应该可以通过命令进行交互。一个命令可以有子命令。参数(Args):命令的参数标志(Flags):修饰

2021-07-19 21:47:27 2567

原创 Tendermint 共识分析

概述Tendermint的共识算法可以看成是POS+BFT,Tendermint在进行BFT共识算法确认区块前 ,首先使用POS算法从Validators中选举出Proposer。然后由Proposer进行提案,最后使用BFT算法生成区块。Tendermint 的共识协议使用的gossip协议。其中使节点成为Validator有两种方法,具体可参考:https://docs.tendermint.com/master/nodes/validators.htmlround-robin从Validato

2021-05-17 22:11:52 1482 9

原创 tendermint state分析

概述state是共识引擎最新提交区块的一个简单描述,它包含了验证一个区块所有的必要信息,例如验证者集合、共识参数。state并不会在网络中进行传播。对state进行操作时,应该使用state.Copy() 或者updateState()。statetype State struct { // 共识版本 Version Version // ChainID和InitialHeight的默认值都在创世块配置文件中进行配置。 // 并且在整个链中都不应该变化 ChainID

2021-05-16 11:11:38 1303 9

原创 Tendermint mempool分析

mempool 接口我们先看一下在mempool/mempool.go 文件里定义了的mempool接口。// 对内存池的更新需要与提交区块同步,这样应用程序就可以在提交时重置它们的瞬间状态。type Mempool interface { // CheckTx对应用程序执行一个新事务,来确定它的有效性,以及是否应该将它添加到内存池。 CheckTx(tx types.Tx, callback func(*abci.Response), txInfo TxInfo) error // Reap

2021-05-15 23:50:24 595 2

原创 Tendermint P2P源码分析

启用P2P在node/node.go的NewNode里,会发现这样一段代码。// setup Transport and Switch // 创建switch sw := createSwitch( config, transport, p2pMetrics, mpReactorShim, bcReactorForSwitch, stateSyncReactorShim, csReactorShim, evReactorShim, proxyApp, nodeInfo, nodeKey, p

2021-05-09 23:32:51 1637 16

原创 Tendermint KVStore案例解析

概述Tendermint 简单的可以理解为是一个模块化的区块链开发框架,支持开发者个性化定制自己的区块链,而不需要考虑共识算法以及P2P网络的实现。因为在 Tendermint 中,共识引擎和P2P网络都被封装在Tendermint Core 中,并通过ABCI与应用层进行交互。所以使用Tendermint开发时,我们只需要实现ABCI的接口,就可以快速的开发一个区块链应用。KVStore 案例KVStore官方文档地址:https://docs.tendermint.com/master/tuto

2021-05-07 17:44:07 957 10

原创 go语言实现简易比特系统(八):总结

1. 系统流程图这是代码要实现的功能2. 主函数func main () { //创建一个区块链, 指定输出地址 bc := NewBlockChain("1KzwEHm9adpgyT3DhDQPX7m99wQ4juXtiw") //调用命令行命令 cli := CLI{bc} //处理相应请求 cli.Run()}3. 命令行函数type CLI struct { bc *BlockChain}const Usage = ` printChain 正向打印区块链

2021-04-10 10:04:12 595 7

原创 Java数组总结及内存分析

1.数组概述1.1 Java数组是一种常见的数据结构,可用于存储多个数据,每个数组元素存放一种数据。(但Java类与类之间可以支持继承关系,这样可能产生一个数组可以存放多种数据类型的假象)。这些无序排列的同类数据元素的集合称为数组。通常可通过数组元素的索引来访问数组元素。1.2 使用数组的好处:提高代码的简洁性和效率、查询数据方便。1.3Java数组特点:一旦数组初始化完成,长度便不可改变。Java数组既可以存储基本数据类型的数据,也可以存储引用类型的数据。Java数组本身就是一种引用类型,其名称为t

2020-06-22 18:05:12 416 3

原创 JDK下载及环境变量配置 and why do that.(详解)

基础工具首先,想要配置Java环境当然要下载一下Java的开发工具喽。下载jdk找到你需要的版本进行下载下载后双击打开,等待安装。点击下一步点击更改,切换安装目录到D盘点击下一步,等待安装完成完成即可。安装完成后就可以配置环境变量啦。恐怖的环境配置初级恐怖(掌握)依次进行以下操作:此电脑(右击)————属性(左击)——高级系统设置——环境变量高级恐怖(理解)...

2020-06-18 22:22:06 275

原创 一张图捋清Java发展史

一张图捋清Java发展史话不多说,直接上图当然啦,图片只是大纲。下面我们对各个阶段来个大概的描述吧!1990年:Sun公司打算进军嵌入式系统并在电器领域大展身手。一开始选择的编程语言为C++,但由于C++的各种局限性,Sun公司的技术团队决定开发一种新的语言:Oak1994年:互联网和浏览器的出现了,Sun公司意识到了商机。并立马完成了第一个Java语言的网页浏览器。当时Oak商标已被注册,于是就改为Java了。1995年:Sun公司把Java放到互联网上,甚至源代码也对所有人公开。

2020-06-17 11:05:12 1542 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除