自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

码墨

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

  • 博客(54)
  • 资源 (9)
  • 收藏
  • 关注

原创 p2p网络中的NAT穿透

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

2019-03-31 16:09:09 3677

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

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

2019-03-07 14:38:05 1530

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

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

2019-02-28 11:35:08 2074 1

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

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

2019-01-14 23:50:00 1387

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

常见排序算法分类排序算法种类繁多。根据处理的数据规模与存储特点,可分为内部排序和外部排序:前者处理的数据规模不大,内存足以容纳;后者处理的数据规模较大,必须将数据存放于外部存储器中,每次排序的时候需要访问外存。根据输入的不同形式,分为脱机算法和在线算法:前者待排序的数据是以批处理的形式给出的;而在云计算之类的环境中,待排序的数据是实时生成的,在排序算法开始运行时,数据并未完全就绪,而是随着排序算...

2019-01-13 18:46:31 2666 4

原创 Go语言队列实现

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

2018-11-28 23:48:11 1998

原创 Go语言栈实现

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

2018-11-28 23:39:07 1099

原创 Go语言链表实现

package linklistimport ( "errors" "fmt")type ListNode struct { data interface{} next *ListNode}type LinkList struct { head *ListNode length uint}func NewLinkList() *LinkList { retu..

2018-11-25 22:43:54 2401 1

原创 Go语言数组实现

package arrayimport ( "errors" "fmt")type Array struct { data []interface{} //存储数组数据 length uint //数组当前长度}func NewArray(capacity uint)*Array{ if capacity == 0 { return nil }...

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

原创 AES 加密算法

AES 高级加密标准(Advanced Encryption Standard),它是 DES 的进化版,加密强度更好,更难破解。一、AES 算法总体结构首先 AES 属于是分组加密的方式加密,算法执行时会把明文分成一组一组,每组长度都是 16 个字节,也就是 128 位,密钥的长度分为 128 位 192 位和 256 位;每组的加密算法都一样,所以我们就介绍一组加密的过程即可;这里以 12...

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

原创 3DES加密算法

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

2018-11-16 09:51:30 2674

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

SHA 是一系列的加密算法,有 SHA-1、SHA-2、SHA-3 三大类,而 SHA-1 已经被破解,SHA-3 应用较少,目前应用广泛相对安全的是 SHA-2 算法,这也是本篇文章重点要讲述的算法。一、算法核心思想和特点该算法的思想是接收一段明文,然后以一种不可逆的方式将它转换成一段密文,也可以简单的理解为取一串输入码,并把它们转化为长度较短、位数固定的输出序列即散列值的过程。1. 单向...

2018-11-15 17:12:48 933

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

一、MD5 算法特性MD5 属于 Hash 算法中的一种,它具有以下特性:输入任意长度的信息,经过处理,输出为 128 位的信息(数字指纹)。不同的输入得到的不同的结果(唯一性)。根据 128 位的输出结果不可能反推出输入的信息(不可逆)。可见继承了 Hash 算法的优良特点,用处很多,如登录密码、数字签名等。二、Go语言使用MD5算法func digest(data []byt...

2018-11-15 16:00:08 485

原创 哈希(Hash)算法

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

2018-11-15 15:05:37 43393 3

原创 密码学基础

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

2018-11-13 23:37:21 739

原创 Go语言TCP/UDP编程

一、TCP/UDP协议TCP (Transmission Control Protocol)和UDP(User Datagram Protocol)协议属于传输层协议。其中TCP提供IP环境下的数据可靠传输,它提供的服务包括数据流传送、可靠性、有效流控、全双工操作和多路复用。通过面向连接、端到端和可靠的数据包发送。通俗说,它是事先为所发送的数据开辟出连接好的通道,然后再进行数据发送;而UDP则不...

2018-11-13 22:41:02 1348

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

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

2018-11-12 20:56:01 2935

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

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

2018-10-21 22:56:25 10100

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

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

2018-10-09 23:12:32 527

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

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

2018-10-09 15:32:29 1949

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

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

2018-10-09 10:04:06 1271

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

一、以太坊geth入口函数调用geth程序的入口函数在go-ethereum/cmd/geth/main.go 里面,主要包括main函数,以及初始化等操作。源码位置: go-ethereum/cmd/geth/main.gofunc init() { // Initialize the CLI app and start Geth app.Action = geth app.Hid...

2018-10-07 11:01:13 953

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

以太坊底层分布式网络即P2P网络,使用了经典的Kademlia网络,简称kad。一、核心数据结构NodeTable类负责以太坊的节点发现,NodeTable采用kademlia(KAD)算法进行节点发现NodeTable维护一个网络节点列表,此列表为当前可用节点,供上层使用由于NodeID经过sha3生成出的Hash为256位。列表有256-1=255项,其中-1是因为刨除了当前节点(本...

2018-09-21 11:00:18 3031 1

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

一、以太坊p2p模块组成在以太坊p2p目录下,主要包括以下几个模块:p2p模块功能discover包含了Kademlia协议。是基于UDP的p2p节点发现协议。discv5新的节点发现协议。 还是试验属性enr实现EIP-778中的以太坊节点记录nat提供网络端口映射协议netutil网络包拓展protocolsp2p子协议拓展...

2018-09-20 19:23:15 3662 1

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

一、RSA算法概述RSA是"非对称加密算法",非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。公钥与私钥是配对的,用公钥加密的数据只有配对的私钥才能解密,反之亦然。因加解密使用两个不同的密钥,所以这种算法叫作非对称加密算法。使用RSA加密算法流程如下:1.消息接收方B先把公钥广播,消息发送方A保存B的公钥2.当A需要向B发送消息时,先用B的公...

2018-09-19 20:22:44 775

原创 DES加密算法

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

2018-09-17 12:06:10 2489

原创 区块链简介

一、区块链是什么区块链不是一门具体技术,而是一个系统框架的设计,通过一系列技术组合从而实现的一个去中心化存储数据库。区块链是加密货币底层的技术,无需中心服务器,可实现各类存储数据公开、透明、可追溯。区块链技术最早是通过比特币底层技术抽象出来的,原本是比特币等加密货币存储数据的一种独特方式,是一种自引用的数据结构,用来存储大量交易信息,每条记录从后向前有序链接起来,具备公开透明、无法篡改、方便追...

2018-09-15 15:35:25 3685 1

原创 Go语言闭包详解

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

2018-09-01 09:54:14 359

原创 Go语言错误处理

学习错误处理是任何一门语言都必须有的一个重要内容,Go语言漂亮的错误处理也是它的亮点之一。一、error接口标准库将error定义为接口类型,以便于自己定义错误类型。type error interface{ Error() string}通常,error总是最后一个返回参数。标准库提供了相关创建函数,可方便的创建包含简单错误文本的error对象。var er...

2018-08-29 22:11:52 530

原创 Go语言goroutine和通道学习

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

2018-08-29 19:38:14 792

原创 Go语言接口详解

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

2018-08-26 02:17:19 3379 3

原创 Go语言函数详解

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

2018-08-25 16:09:39 1703

原创 Go语言Map详解

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

2018-08-24 18:48:40 10422

原创 Go语言切片深层解析

一、Go语言中切片类型出现的原因切片是一种数据类型,这种数据类型便于使用和管理数据集合。 创建一个100万个int类型元素的数组,并将它传递给函数,将会发生什么? var array [le6]int foo(array) fun foo(array [le6]int){ … }在64位架构上,100个int类型的数组需要800万字节,即8M的内存。...

2018-08-23 20:24:34 417 1

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

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

2018-08-20 23:12:20 1106

原创 Goland开发环境搭建详解

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

2018-08-19 17:31:02 6558

原创 操作系统概述

操作系统做了什么当在计算机上通过鼠标或者命令行启动一个程序时,程序启动的顺序为:首先找到程序的相关信息,检查程序是否是可执行程序(windows下可执行程序为PE结构,Linux下可执行程序为ELF结构);再检测程序的首部信息,确定程序中的代码段和数据段的位置,操作系统计算出对应的磁盘块地址。操作系统将创建一个新的进程,并将可执行程序映射进进程结构,再由改进程执行可执行程序。

2017-10-29 21:27:18 317

转载 计算机是如何启动的?

我一直搞不清楚,这个过程到底是怎么回事,只看见屏幕快速滚动各种提示…… 这几天,我查了一些资料,试图搞懂它。下面就是我整理的笔记。零、boot的含义先问一个问题,”启动”用英语怎么说?回答是boot。可是,boot原来的意思是靴子,”启动”与靴子有什么关系呢? 原来,这里的boot是bootstrap(鞋带)的缩写,它来自一句谚语:  “pull oneself up by one’s bootst

2017-10-04 22:18:47 251

转载 柔性数组

处理二进制协议时,过去常用的方法是,只定义协议头,或者用char data[1]定义协议体只定义协议头不够直观,需要计算协议体地址;而data[1]需要进行类型转换,其实也是计算协议体地址现在发现有一种更“优雅”的方法:柔性数组,可以这样定义:struct protocol{    uint32_t len;    uint32_t type;    uint16_t cmd;    byte

2017-02-25 17:17:46 3496

原创 数组与指针

数组与指针一、变量变量:是一个标识符(identifier),用来指代一块内存区域,使用变量使我们操作内存以区域(area),以块(block)为单位,提高了方便性。变量是内存区域的别名,机器代码中,是不会出现变量名的;变量名是给我们程序员操作内存来使用的,机器码中将变量名替换成了相应的内存地址。当我们定义int a时,编译器负责为程序预留4字节空间,并把我们的变量名“a”保存进符号表,并用这个

2017-02-15 23:55:01 3472

区块链开发教学视频(从入门到精通系统性学习)

文件内包含百度云链接,永久有效 最新整理区块链技术视频包含开发工具,源码,视频教程,从小白到大神,系统性学习,分享给大家学习。 主要包含:公链开发视频目录、从零构建以太坊(Ethereum)智能合约到项目实战视频教程、Hyperledger Fabric 超级账本视频教程、Ethereum & IPFS去中心化Ebay区块链项目实战视频教程、区块链密码学视频教程、Go语言学习视频教程。

2018-11-08

区块链公链开发资料

区块链公链开发视频教程,可以快速学习区块链知识,掌握区块链公链开发。

2018-11-06

区块链数据结构

区块链内部的数据结构进行说明,里面详细介绍了区块链的数据规范,对理解区块链有很好的帮助。

2018-09-06

深入解析Go

Go语言语法简单,但是如果想要深入解析Go语言,这本书是很好的选择。从源码层面深入分析了它的实现。

2018-08-24

Go语言圣经

Go是一个开源的编程语言,它很容易用于构建简单、可靠和高效的软件。本书是为了帮助你开始以有效的方式使用Go语言,充分利用语言本身的特性和自带的标准库去编写清晰地道的Go程序。

2018-08-24

精通UNIX下C语言编程与项目实践源码与笔记

能快速的帮助初学者学习UNIX下的C语言编程,帮助初学者快速的进入服务器开发的大门。

2018-01-17

Atomineer.Utils 9.22试用版破解

AtomineerUtils是国外的一款用于生成源代码注释的一款VS插件,支持C、C++、C++/CLI、C#、Java语言等,由此可以看出其强大,注释的风格可以灵活配置。

2016-11-12

适合vs2015的番茄助手, 解决每次vs2015 vassistX 重启之后都要重新破解的解问题,

适合vs2015的番茄助手,亲测可用! 破解方法:将破解包里的PiaoYun.dll和VA_X.dll复制到当前用户下的AppData\Local\Microsoft\VisualStudio\14.0\Extensions\es0tjwym.zme中,注意“es0tjwym.zme”这个名字是随机的,不同pc名称不一样,注意区分。 装了小番茄后 感觉不错 但每次关机开机后就不能继续用了 很苦恼 ,原来 vs2015 每次都会创建一个小番茄插件的文件 并且还是随机名字 ,修改Extensions文件夹的权限,将权限改为拒接写入。

2016-11-12

3D打印机资料

关于一些3D打印机的资料,包括文档和代码,对于学习3D打印很有帮助。

2015-12-02

空空如也

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

TA关注的人

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