自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

码墨

我是自己人生的导演,我的人生由自己设计。

原创 p2p网络中的NAT穿透

一、p2p网络 1、简介   p2p网络,即对等计算机网络,是一种在对等者(Peer)之间分配任务和工作负载的分布式应用架构,是对等计算模型在应用层形成的一种组网或网络形式。网络的参与者共享他们所拥有的一部分硬件资源(处理能力、存储能力、网络连接能力、打印机等),这些共享资源通过网络提供服务和内容...

2019-03-31 16:09:09 491 0

原创 MIT 6.824 分布式课程Lab2 2B 日志追加实现

这部分主要实现附加日志部分,即一致性操作。主要涉及到完善Start()函数,完善附加日志请求AppendEntries RPC和回复AppendEntriesReply RPC结构,并实现附加日志过程函数。 一、AppendEntries和AppendEntriesReply结构 根据论文来完善A...

2019-03-07 14:38:05 432 0

原创 MIT 6.824 分布式课程Lab2 2A Raft领导者选举和心跳机制

一、Raft选主流程 当新集群启动的时候,所有的机器A、B、C的默认状态是Follower,所有的机器地址endpoint作为初始化参数传入进程。 如果收到心跳,则作为Follower开始工作,选主结束。如果超过一段随机选举超时时间后(在一定范围且大于心跳时间), 开始发起Election。随机...

2019-02-28 11:35:08 540 0

原创 MIT 6.824 分布式课程 Raft算法简介

Raft 是一种为了管理复制日志的一致性算法。 复制状态机 一致性算法是从复制状态机的背景下提出的。在这种方法中,一组服务器上的状态机产生相同状态的副本,并且在一些机器宕掉的情况下也可以继续运行。复制状态机在分布式系统中被用于解决很多容错的问题。例如,大规模的系统中通常都有一个集群领导者,像 GF...

2019-01-14 23:50:00 441 0

原创 Go语言经典排序算法实现

常见排序算法分类 排序算法种类繁多。根据处理的数据规模与存储特点,可分为内部排序和外部排序:前者处理的数据规模不大,内存足以容纳;后者处理的数据规模较大,必须将数据存放于外部存储器中,每次排序的时候需要访问外存。根据输入的不同形式,分为脱机算法和在线算法:前者待排序的数据是以批处理的形式给出的;而...

2019-01-13 18:46:31 523 1

原创 Go语言队列实现

一、队列结构特点 队列是一种可以实现“先进先出”的存储结构。你可以把它想象成排队买票,先来的先买,后来的人只能站末尾,不允许插队。先进者先出,这就是典型的“队列”。 队列最基本的操作是两个:入队 enqueue(),放一个数据到队列尾部;出队 dequeue(),从队列头部取一个元素。 二、Go...

2018-11-28 23:48:11 469 0

原创 Go语言栈实现

一、栈数据结构特点 栈是一种“操作受限”的线性表,只允许在一端插入和删除数据。 当某个数据集合只涉及在一端插入和删除数据,并且满足后进先出、先进后出的特性,我们就应该首选“栈”这种数据结构。 栈主要包含两个操作,入栈和出栈,也就是在栈顶插入一个数据和从栈顶删除一个数据。 二、Go语言实现栈 栈既可...

2018-11-28 23:39:07 250 0

原创 Go语言链表实现

package linklist import ( "errors" "fmt" ) type ListNode struct { data interface{} next *ListNode ...

2018-11-25 22:43:54 292 0

原创 Go语言数组实现

package array import ( "errors" "fmt" ) type Array struct { data []interface{} //存储数组数据 length uint //数组当前长度 } f...

2018-11-21 13:58:04 281 1

原创 ECC 椭圆曲线加解密算法

随着计算机性能的提高,部分算法已经不再安全,但是道高一尺魔高一丈,加密算法也在不断的进步和演化,通常的方法是增加密钥长度,越长越安全,确实也管用,但是性能同样也有损失,本篇要介绍的 ECC 椭圆曲线加密算法就是一种密钥长度增加不多,但是密码强度增加很多的算法,比 RSA 强多了,像比特币,以太坊中...

2018-11-18 23:53:54 2197 0

原创 AES 加密算法

AES 高级加密标准(Advanced Encryption Standard),它是 DES 的进化版,加密强度更好,更难破解。 一、AES 算法总体结构 首先 AES 属于是分组加密的方式加密,算法执行时会把明文分成一组一组,每组长度都是 16 个字节,也就是 128 位,密钥的长度分为 12...

2018-11-16 10:34:04 869 1

原创 3DES加密算法

一、3DES加密 DES是一个经典的对称加密算法,但也缺陷明显,即56位的密钥安全性不足,已被证实可以在短时间内破解。为解决此问题,出现了3DES,也称Triple DES,3DES为DES向AES过渡的加密算法,它使用3条56位的密钥对数据进行三次加密。为了兼容普通的DES,3DES并没有直接使...

2018-11-16 09:51:30 205 0

原创 深入理解 SHA 系列加密算法及Go语言运用

SHA 是一系列的加密算法,有 SHA-1、SHA-2、SHA-3 三大类,而 SHA-1 已经被破解,SHA-3 应用较少,目前应用广泛相对安全的是 SHA-2 算法,这也是本篇文章重点要讲述的算法。 一、算法核心思想和特点 该算法的思想是接收一段明文,然后以一种不可逆的方式将它转换成一段密文,...

2018-11-15 17:12:48 188 0

原创 MD5算法原理及Go语言运用与实现

一、MD5 算法特性 MD5 属于 Hash 算法中的一种,它具有以下特性: 输入任意长度的信息,经过处理,输出为 128 位的信息(数字指纹)。 不同的输入得到的不同的结果(唯一性)。 根据 128 位的输出结果不可能反推出输入的信息(不可逆)。 可见继承了 Hash 算法的优良特...

2018-11-15 16:00:08 83 0

原创 哈希(Hash)算法

一、什么是 Hash 算法 散列算法(Hash Algorithm),又称哈希算法,杂凑算法,是一种从任意文件中创造小的数字「指纹」的方法。与指纹一样,散列算法就是一种以较短的信息来保证文件唯一性的标志,这种标志与文件的每一个字节都相关,而且难以找到逆向规律。因此,当原有文件发生改变时,其标志值也...

2018-11-15 15:05:37 4557 0

原创 密码学基础

一、什么是密码学 密码学是研究编制密码和破译密码的技术科学。研究密码变化的客观规律,应用于编制密码以保守通信秘密的,称为编码学;应用于破译密码以获取通信情报的,称为破译学,总称密码学。 在通信过程中,待加密的信息称为明文,已被加密的信息称为密文,仅有收、发双方知道的信息称为密钥。在密钥控制下,...

2018-11-13 23:37:21 109 0

原创 Go语言TCP/UDP编程

一、TCP/UDP协议 TCP (Transmission Control Protocol)和UDP(User Datagram Protocol)协议属于传输层协议。其中TCP提供IP环境下的数据可靠传输,它提供的服务包括数据流传送、可靠性、有效流控、全双工操作和多路复用。通过面向连接、端到端...

2018-11-13 22:41:02 288 0

转载 Go语言TCP网络编程(详细)

一、序言 Golang的主要 设计目标之一就是面向大规模后端服务程序,网络通信这块是服务端 程序必不可少也是至关重要的一部分。在日常应用中,我们也可以看到Go中的net以及其subdirectories下的包均是“高频+刚需”,而TCP socket则是网络编程的主流,即便您没有直接使用到net中...

2018-11-12 20:56:01 462 0

原创 走迷宫问题广度优先算法实现

走迷宫问题 迷宫是许多小方格构成的矩形,在每个小方格中有的是墙(用1表示),有的是路(用0表示)。走迷宫就是从一个小方格沿上、下、左、右四个方向到邻近的方格,当然不能穿墙。 问题描述 实现生成迷宫(从文本中读取数据生成),输出迷宫(图案方式),探索迷宫路径(最短路径),输出迷宫路径(图案方式)。 ...

2018-10-21 22:56:25 6184 0

原创 以太坊私有网络集群搭建

一、安装geth客户端 geth是以太坊的官方客户端,它是一个命令行工具,提供很多命令和选项,可以运行以太坊节点、创建和管理账户、发送交易、挖矿、部署智能合约等。 geth客户端可使用三种方法进行安装: 源码编译安装 直接下载可执行文件 一、源码编译安装 在前面Go语言学习笔记...

2018-10-17 22:28:08 286 0

翻译 以太坊p2p网络子协议开发框架运用

以太坊的peer to peer (go-ethereum/p2p)模块能够让你便捷地在p2p网络上开发任何应用。这个p2p 包采用现代化的模块设计,能够很容易地在其之上扩展自己的额外通信协议。 开始一个p2p服务需要你先从构造一个p2p.Server{}实例开始: import &a...

2018-10-09 23:12:32 191 0

原创 以太坊p2p网络(六):以太坊peer的连接和消息处理

当TCP连接池跟一个节点进行rlpx握手,建立加密连接后,接下来会触发server.run 函数的addpeer管道传递消息,在server.run()函数里面捕获这个消息,进而创建一个peer实例,创建一个协程单独处理这个节点,进行业务层面的后续处理。 func (srv *Server) r...

2018-10-09 15:32:29 675 0

原创 以太坊p2p网络(五):P2P模块TCP连接池网络通信机制源码分析

上节中通过设置静态节点BootstrapNodes节点来发现更多全网的其他节点,这部分只是发现节点并找出其中可以ping通的节点,但是还没有进行使用,还没建立TCP连接进行数据传输,协议处理等。 这里主要分析P2P系统的TCP连接池的建立,以及是怎么跟其他节点通信的。 一、TCP监听 P2P网络服...

2018-10-09 10:04:06 298 0

原创 以太坊p2p网络(四):以太坊P2P模块基于UDP的服务发现机制源码分析

以太坊的底层P2P模块承担了节点之间的通信和服务发现,新节点发现连接的功能,p2p网络部分主要分为两个部分: 节点发现, 怎么发现附近的其他节点; 节点连接,怎么去连接其他节点并互相通信。 以太坊使用UDP进行服务发现,通讯内容比较简单,所以没有加密。而使用TCP进行真正的数据传输和交互,这部...

2018-10-08 22:37:30 470 0

原创 以太坊p2p网络(三):以太坊p2p网络启动源码分析

一、以太坊geth入口函数调用 geth程序的入口函数在go-ethereum/cmd/geth/main.go 里面,主要包括main函数,以及初始化等操作。 源码位置: go-ethereum/cmd/geth/main.go func init() { // Initializ...

2018-10-07 11:01:13 230 0

转载 以太坊p2p网络(二):以太坊P2P节点发现算法原理剖析

以太坊底层分布式网络即P2P网络,使用了经典的Kademlia网络,简称kad。 一、核心数据结构 NodeTable类负责以太坊的节点发现,NodeTable采用kademlia(KAD)算法进行节点发现 NodeTable维护一个网络节点列表,此列表为当前可用节点,供上层使用 由于...

2018-09-21 11:00:18 713 0

原创 以太坊p2p网络(一):以太坊p2p网络部分结构

一、以太坊p2p模块组成 在以太坊p2p目录下,主要包括以下几个模块: p2p模块 功能 discover 包含了Kademlia协议。是基于UDP的p2p节点发现协议。 discv5 新的节点发现协议。 还是试验属性 enr 实现EIP-778中的以太坊节点记录 na...

2018-09-20 19:23:15 1046 0

原创 go-ethereum源码的设计框架与模块解析

go-ethereum项目的组织结构基本上是按照功能模块划分的目录,每个目录在GO语言里面又被成为一个Package,根据源码目录来理清模块关系: 源码目录 模块说明 accounts 以太坊账户管理 accounts/abi 实现了Ethere...

2018-09-20 15:08:37 636 0

原创 RSA算法讲解与Go语言实例

一、RSA算法概述 RSA是"非对称加密算法",非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。公钥与私钥是配对的,用公钥加密的数据只有配对的私钥才能解密,反之亦然。因加解密使用两个不同的密钥,所以这种算法叫作非对...

2018-09-19 20:22:44 126 0

原创 DES加密算法

一、对称加密算法 网络安全通信中要用到两类密码算法,一类是对称密码算法,另一类是非对称密码算法。对称密码算法有时又叫传统密码算法、秘密密钥算法或单密钥算法,非对称密码算法也叫公开密钥密码算法或双密钥算法。 对称加密的加密密钥能够从解密密钥中推算出来,同时解密密钥也可以从加密密钥中推算出来...

2018-09-17 12:06:10 138 0

原创 区块链简介

一、区块链是什么 区块链不是一门具体技术,而是一个系统框架的设计,通过一系列技术组合从而实现的一个去中心化存储数据库。区块链是加密货币底层的技术,无需中心服务器,可实现各类存储数据公开、透明、可追溯。区块链技术最早是通过比特币底层技术抽象出来的,原本是比特币等加密货币存储数据的一种独特方式,是一...

2018-09-15 15:35:25 435 0

原创 Go语言闭包详解

人们常说面向对象编程和面向过程编程,随着硬件性能的提升以及编译技术和虚拟机技术的改进,一些曾被性能问题所限制的动态语言开始受到关注,Python、Ruby 和 Lua 等语言都开始在应用中崭露头角。动态语言因其方便快捷的开发方式成为很多人喜爱的编程语言,伴随动态语言的流行,函数式编程也再次进入了我...

2018-09-01 09:54:14 132 0

原创 Go语言错误处理

学习错误处理是任何一门语言都必须有的一个重要内容,Go语言漂亮的错误处理也是它的亮点之一。 一、error接口 标准库将error定义为接口类型,以便于自己定义错误类型。 type error interface{ Error() string } 通常,error总是最后一个...

2018-08-29 22:11:52 333 0

原创 Go语言goroutine和通道学习

Go语言里的并发指的是能让某个函数独立于其他函数运行的能力。当一个函数创建为goroutine时,Go会将其视为一个独立的工作单位。这个单元会被调度到可用的逻辑处理器上执行。 Go语言运行时的调度器是一个复杂的软件,能管理被创建的所有goroutine并为其分配执行时间。这个调度器在操作系统之上...

2018-08-29 19:38:14 524 0

原创 Go语言接口详解

接口在Go语言有着至关重要的地位。接口是Go语言这个类型系统的基石,让Go语言在基础编程哲学的探索上达到了前所未有的高度。 接口解除了类型依赖,有助于减少用户的可视方法,屏蔽了内部结构和实现细节。但是接口实现机制会有运行期开销,也不能滥用接口。相对于包,或者不会频繁变化的内部模块之间,不需要抽象...

2018-08-26 02:17:19 1125 0

原创 Go语言函数详解

函数是结构化编程的最小模块。它将复杂的算法过程分解为若干较小的任务,隐藏相关细节,是的程序结构更加清晰,易于维护。函数被设计成相对独立,通过接受输入参数完成一段算法指令,输出或存储相关的结果。函数是代码复用和测试的基本单位。 函数的定义 函数构成代码执行的基本逻辑结构。在Go语言中,函数的基本...

2018-08-25 16:09:39 357 0

原创 Go语言Map详解

map(字典、哈希表、映射)是一种使用频率很高的数据结构,将其作为语言的内置类型,从运行时层面进行优化,可获得更好的性能。 一、内部实现 map的源码结构为: // A header for a Go map. type hmap struct { // Note: the form...

2018-08-24 18:48:40 3369 0

原创 Go语言切片深层解析

一、Go语言中切片类型出现的原因 切片是一种数据类型,这种数据类型便于使用和管理数据集合。 创建一个100万个int类型元素的数组,并将它传递给函数,将会发生什么? var array [le6]int foo(array) fun foo(array [le6]int...

2018-08-23 20:24:34 218 0

原创 Go语言的常量与变量使用注意事项

一、变量 Go是静态类型,不能在运行期改变变量的类型。 面试题 关于全局变量的初始化,下面正确的使用方式是 A、var i int = 10 B、var i = 10 C、i := 10 这是一个关于Go语言全局变量声明和赋值的考察,Go语言中的变量声明使用关...

2018-08-20 23:12:20 553 0

原创 Goland开发环境搭建详解

Golang开发环境搭建 首先学习一门开发语言首先先要搭建开发环境,有了环境我们才能进行代码的开发,先介绍在一些主流的操作系统编译环境的搭建和IDE选择。 一、Go语言开发环境搭建 要搭建Go语言开发环境,先下载Go语言的开发工具包,下载下载地址:https://golang.org/d...

2018-08-19 17:31:02 2752 0

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