自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

seafooler的专栏

随便写写

  • 博客(64)
  • 资源 (1)
  • 收藏
  • 关注

原创 也谈PBFT/Tendermint/HotStuff中的活性问题、响应度问题和锁定问题

文章目录1. 写在前面2.两/三阶段共识中的锁定机制3.共识协议中Leader可信度的不同4.Single-modal类共识中锁定机制的设计4.1 对锁定机制中规则2活性的理解4.2 为什么Tendermint在进行leader切换的时候要等待Δ\DeltaΔ4.2.1 Tendermint不等待Δ\DeltaΔ导致的Hidden Lock问题4.2.2 为什么等待Δ\DeltaΔ可以解决Hidden Lock问题4.3 为什么HotStuff不需要等待Δ\DeltaΔ1. 写在前面在HotStuff的

2021-09-20 23:33:49 1268 1

原创 Fabric中PBFT源码解读——状态同步

文章目录1.写在前面1.1 前置阅读1.2 instance.skipInProgress字段2. 标记需要进行“状态同步”3. 启动“状态同步”操作4. retryStateTransfer函数的实现细节5. simpleConsumer.skipTo函数的实现细节参考文献1.写在前面1.1 前置阅读本篇博客是建立在之前一些博客的基础上。一切重复的知识介绍,笔者在这篇博客中就不再赘述了。因此,强烈建议读者先去阅读一下以下这几篇博客。Fabric中PBFT源码解读 (1)Fabric中PBFT

2021-01-24 22:45:38 610 1

原创 Fabric中PBFT源码解读——Checkpoint机制

文章目录1. 写在前面1.1 前置阅读1.2 对TestCheckpoint函数的测试2. 对TestCheckpoint函数运行流程的解读2.1 Checkpoint和Water mark的概念解释2.2 sendPrePrepare函数中对sequence的检查2.3 Commit请求时生成Checkpoint2.4 recvCheckpoint函数的实现细节(1)2.4 recvCheckpoint函数的实现细节(2)3. 小结参考文献1. 写在前面1.1 前置阅读本篇博客是建立在之前一些博客的

2021-01-23 21:15:31 754 2

原创 为什么PBFT中需要2f+1

文章目录0. 写在前面1. Prepare阶段为何需要2f+1?2. Commit阶段为何需要2f+1?参考文献0. 写在前面关于PBFT中为什么需要2f+1个Prepare/Commit的问题,网上其实有很多博客和文献来阐述,如这篇博客PBFT中的几个重要参数以及这本书"Introduction to reliable and secure distributed programming"。这些博客和文献大都采用了比较理论的证明方式,使用了Quorum的概念。即拜占庭网络中的Quorum值是2f+1

2021-01-12 12:51:46 2202 7

原创 为什么PBFT协议中需要Commit阶段

文章目录1. 写在前面:一个问题2. Prepared数据作为可执行证明3. 假设不存在Commit阶段4. Commit阶段如何解决上述问题参考文献1. 写在前面:一个问题我们首先来思考一个问题:对于BFT类型的共识,每个正确节点在执行一条交易(客户端发出的执行请求)之前中需要满足什么样的条件?或者说它应该在何时执行一条交易?笔者的理解是:它需要利用一个确切的机制/算法,去检查一种时机/条件。该算法保证满足了该时机/条件后,其他正确节点也会做出相应的执行操作,此时其便可执行该交易。这便暗含着一个要求

2021-01-12 11:25:20 1925 19

原创 Fabric中PBFT源码解读 (5)

文章目录9. 节点对reqBatch的执行流程9. 节点对reqBatch的执行流程在上一篇博客中第7节的最后,我们介绍到节点在接收到execDoneEvent类型的Event后,将调用instance.execDoneSync()对该event对应的reqBatch进行执行。为方便后面的表述,我们假设reqBatch代表了一批交易。为方便读者理解,我们将相关代码再次摘录如下:// [pbft-core.go] ProcessEventfunc (instance *pbftCore) Proce

2021-01-08 17:14:34 452 2

原创 Fabric中PBFT源码解读 (4)

文章目录7. Commit消息的接收以及后续执行8. 测试的优雅结束7. Commit消息的接收以及后续执行本系列的第一篇博客介绍了源代码的获取和测试用例的选择;第二篇博客介绍了Primary节点对repBatch的处理,以及对PrePrepare消息的发送;第三篇博客介绍了Preprepare消息的接收以及Prepare消息的发送、Prepare消息的接收以及Commit消息的发送。强烈建议读者先阅读上述三篇博客,再来阅读当前这篇。第三篇博客的第6节介绍了节点2中对Commit消息的发送,本节介绍

2021-01-08 10:52:29 469 1

原创 Fabric中PBFT源码解读 (3)

5. Preprepare消息的接收以及Prepare消息的发送本系列的第一篇博客介绍了源代码的获取和测试用例的选择,第二篇博客介绍了Primary节点对repBatch的处理,以及对PrePrepare消息的发送。强烈建议读者先阅读上述两篇博客,再来阅读当前这篇。4.2小节介绍了节点0中Preprepare消息的发送过程,本小节介绍其他节点(以节点1为例)接收Preprepare消息的过程和发送Prepare消息的过程。由4.2小节的最后介绍可知,节点0的Preprepare消息最终发送到了节点1

2021-01-08 10:19:04 488

原创 Fabric中PBFT源码解读 (2)

文章目录4. Primary节点对repBatch的处理4.1 通道变量events和测试网络变量net4.2 Preprepare消息的发送过程4. Primary节点对repBatch的处理由上一篇博客Fabric中PBFT源码解读(1)的第3节可知,测试数据repBatch传入到了Primary节点(节点0)的events通道中。本节介绍Primary节点如何取出repBatch测试数据,并基于该数据构建及广播PrePrepare消息。在介绍Primary节点的操作之前,首先介绍两个非常重要的变

2021-01-07 15:33:44 758

原创 Fabric中PBFT源码解读 (1)

1. 写在前面笔者一直以来想学习一下PBFT的完整工程实践。但在网上搜了很多源码和博客,都没能找到一份比较独立且完整的PBFT实现。无奈之下,只能从Hyperledger Fabric的代码中学习其PBFT共识部分的代码。因此,接下来的系列博客中,笔者将介绍在Fabric中是如何实现PBFT共识算法的。1.1 源码版本及获取Fabric在0.6版本中采用了PBFT,因此在从github中clone了源代码后,需要首先切换到v0.6.0-preview分支。PBFT共识相关的代码主要包含在fabric

2021-01-07 13:40:15 1844 2

原创 对分布式系统中各种一致性的理解

1. 四种一致性Linearizability:跟时间相关,严格按照时间顺序Sequential:跟时间无关,但要求所有操作在所有进程上被看到的顺序必须一致相同Casual:跟时间无关,但要求有因果关系的操作在所有进程上被看到的顺序必须一致PRAM:跟时间无关,但要求同一个进程中的多个写操作在所有进程上被看到的顺序必须一致,而不同进程上的写操作可以不一致。其忽略了读操作所带来的因果关系的要求2. Linearizability和Sequential比较图a是满足Sequential Co

2020-12-06 19:25:32 1569

原创 谈谈序列化的作用

1. 写在前面我们应该都用过各种序列化(serialization)的方法(如Python中的pickle.dumps),甚至自己也写过一些序列化的小工具。维基百科对于序列化的解释比较冗长;相比之下,百度百科的解释更为简单:序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程这里面重点强调了两个概念:格式的转变和转变的目的[格式的转变] 转变前的...

2020-05-05 21:51:47 7092

原创 谈谈FLP和CAP的关系

1. 写在前面承接上一篇博客:也谈分布式系统中的网络模型和故障模型,本篇博客仍然想探讨一些分布式系统的理论知识。大家应该都听说过分布式系统理论中的FLP不可能性和CAP不可能三角,那么FLP和CAP之间是什么关系呢?等价还是包含?本篇博客,就想来谈谈FLP和CAP之间的关系。2. 理论回顾本节先分别回顾一下FLP和CAP这两个理论。2.1 FLP不可能性Impossibility o...

2020-04-29 15:49:51 2266

原创 也谈分布式系统中的网络模型和故障模型

文章目录1. 写在前面2. 再理解网络模型2.1 一个疑问3. 故障模型的划分3.1 一个疑问3.2 按照故障发生的领域分类(Domain of failure occurrence)3.2.1 值故障 (Value failure)3.2.2 时间故障 (Time failure)3.3 按照用户对数据的感知分类(Perception by the system users)3.3.1 非一致性...

2020-04-23 23:27:17 2707 1

原创 并不唯一的交易ID

文章目录1. 前言2. 事实3. 解释4. 处理4.1. 如何让矿工不生成相同`TxID`的`coinbase`?4.1.1. `BIP30`4.1.1.1. 特殊情况的考虑4.1.2. `BIP34`4.2. 如何处理已有的两起事件?参考文献1. 前言我们知道,比特币中使用交易ID (TxID) 来作为交易在全网的唯一标识。在此语境下,绝大多数人都认为TxID一定是全网唯一的。2. 事实...

2020-03-09 20:35:03 2156

原创 btcd源码解析——交易创建 (3) —— 构造解锁脚本

文章目录5. 构造解锁脚本5.1. `SignTxOutput`函数5.2. `PubKeyHashTy`类型的解锁脚本5.2.1. `ExtractPkScriptAddrs`函数5.2.1.1. `typeOfScript`函数5.2.1.2. `NewAddressPubKeyHash`函数5.2.2. SignatureScript函数5.2.2.1. `RawTxInSignature`...

2020-03-06 21:27:19 634

原创 btcd源码解析 —— 签名机制(3) —— 源码分析

文章目录5. 签名流程——源码层5.1. 特殊情况的处理5.2. 删除`OP_CODESEPARATOR`操作码5.3. `input`部分的通用处理5.4. 针对无修饰类具体类型的处理5.4.1. `SIGHASH_NONE`类型5.4.2. `SIGHASH_SINGLE`类型5.4.3. `SIGHASH_ALL`类型5.5. 针对有修饰类具体类型的处理5.6. 生成`message`5....

2020-03-05 18:35:46 715 2

原创 btcd源码解析 —— 签名机制(2) ——签名流程

文章目录4. 签名流程——原理层4.1. 无修饰类4.1.1. `SIGHASH_ALL`类型4.1.2. SIGHASH_NONE类型4.1.3. SIGHASH_SINGLE类型4.2. 有修饰类4.2.1. `SIGHASH_ALL | SIGHASH_ANYONECANPAY`类型4.2.2. `SIGHASH_NONE | SIGHASH_ANYONECANPAY`类型4.2.3. `S...

2020-03-05 16:39:18 629

原创 btcd源码解析 —— 签名机制(1) —— 基础知识

文章目录1. 写在前面2. 签名流程简述2.1. 签名的数目2.2. 签名的对象3. 签名类型介绍3.1. 基本类型3.2. 组合类型3.3. 源码&字节码分析3.3.1. 定义3.3.2. 举例1. 写在前面在前面的比特币源码分析中,我们有意忽略了签名机制部分的介绍。但比特币的签名机制远非我们想象的那么简单,正如这篇博客Bitcoin contracts所言:Bitcoin a...

2020-03-05 16:07:44 1104

原创 btcd源码解析——交易创建(2)—— input的创建

文章目录4.3. 创建input4.3.1. “创建交易”的请求4.3.2. 生成“创建交易”的请求4.3.3. txToOutputs函数4.3.3.1. makeInputSource函数4.3.3.2. NewUnsignedTransaction函数4.3.3.3. AddAllInputScripts函数4.3. 创建input前一篇博客btcd源码解析——交易创建中的4.2节介绍了...

2020-03-02 23:11:34 599

原创 btcd源码解析——交易创建

1. 写在前面从本节开始,我们从源码层面关注比特币交易的构建过程。其中,我们尤其会关注比特币解锁脚本(为了使用UTXO)和新的锁定脚本(为了生成新的UTXO)的创建细节。我们相信通过跟踪两种脚本的创建过程,我们将对于比特币的交易细节理解得更为深入。新交易的创建会涉及到两个代码仓库(btcd和btcwallet)编译生成的三个可执行文件(btcd,btcctl,和btcwallet)。btc...

2020-02-28 19:37:09 986

原创 btcd源码解析——peer节点之间的区块数据同步 (4) —— 区块数据的存储

1. 写在前面前两篇博客headersFirstMode模式和非headersFirstMode模式主要介绍了区块数据同步过程中两个节点如何交互。但我们当时遗留下一个问题:在peer A接收到区块数据之后,是如何将这个区块存储到本地的。回忆我们在headersFirstMode模式的2.6小节最后提到的由于block的数据存储过程比较复杂,我们在后面会再写一篇博客介绍:从P2P连接中接收到的...

2019-08-05 02:14:08 1303 2

原创 btcd源码解析——peer节点之间的区块数据同步 (3) —— 非headersFirstMode模式

文章目录1. 写在前面2. 非headersFirstMode模式下的数据同步过程2.1 peer A 发送“获取区块哈希”的请求2.2 peer B 响应“获取区块哈希”的请求2.3 peer A 处理“获取区块哈希”的返回数据,并发送“获取区块”的请求2.4 peer B 响应“获取区块”的请求2.5 peer A 处理“获取区块”的返回数据3. 小结1. 写在前面上一篇博客btcd源码解...

2019-07-29 21:27:39 462

原创 btcd源码解析——peer节点之间的区块数据同步 (2) —— headersFirstMode模式

文章目录1. 写在前面2. peer A 发送"获取区块头"的请求3. peer B 响应"获取区块头"的请求4. peer A 处理 "获取区块头"的返回数据5. peer A 发送 "获取区块"的请求1. 写在前面上一篇博客btcd源码解析——peer节点之间的区块数据同步 (1)中,我们介绍了peer A是如何发起数据同步的请求的,当时讲到存在两种模式:headersFirstMode模...

2019-07-24 13:26:54 912

原创 btcd源码解析——peer节点之间的区块数据同步 (1)

文章目录1. 写在前面2. 从peer A发起数据请求开始1. 写在前面从这一篇博客开始,我们将介绍btcd节点之间的数据同步。考虑到内容太长,分为上下两篇博客来讲解。源码解析是基于btcd仓库c26ffa870fd817666a857af1bf6498fabba1ffe3的commit id 版本。我们假设peer B是先启动的节点,peer A后启动。peer A在启动后需要从peer...

2019-07-24 09:10:48 1076

原创 btcd源码解析——节点P2P连接建立的过程 (2)

文章目录4. 与其他peer建立P2P连接4.2 主动连接的管理4.2.1 negotiateOutboundProtocol函数4.2.2 peerDoneHandler函数4.3 被动接受连接4. 与其他peer建立P2P连接我们接着上一篇博客,继续来讲解P2P主动连接的管理和被动接受连接的过程。4.2 主动连接的管理前面介绍到Start [connmanager.go]函数中调用的c...

2019-07-21 14:04:48 589

原创 btcd源码解析——节点P2P连接建立的过程 (1)

1. 写在前面从这一篇博客开始,我们将介绍btcd节点之间P2P连接建立的过程。考虑到内容太长,分为上下两篇博客来讲解。这两篇博客之后,我们将继续介绍节点之间数据的同步过程。源码解析是基于https://github.com/btcsuite/btcd仓库c26ffa870fd817666a857af1bf6498fabba1ffe3的commit id 版本。2. 从节点的“启动”说起b...

2019-07-21 13:24:53 1166 1

原创 btcd源码解析——从“新区块的生成”开始(2)

4.2 作为客户端的btcwallet我们接着上一篇博客,继续来讲解作为客户端的btcwallet是如何工作的。也即,作为客户端的btcwallet是如何与btcd进程交互的。// walletMain[btcwallet.go] -> rpcClientConnnectLoop[btcwallet.go]func rpcClientConnectLoop(legacyRPCServ...

2019-01-22 19:47:35 797 2

原创 btcd源码解析——从“新区块的生成”开始

1. 写在前面我们从‘新区块的生成“开始我们的btcd源码之旅。2. 相关命令# start btcd./btcd -u seafooler -P 123456 --simnet --miningaddr=SRgBmewVAfaVzqKMPHeFYwkiAGD8jKBWFz# start btcwallet./btcwallet -u seafooler -P 123456 --si...

2019-01-22 10:50:02 2170

原创 btcd源码解析

这里写自定义目录标题1.写在前面2. 实验环境1.写在前面因为学习的需要,这一年半和接下来更长的时间都会与Bitcoin打交道。不可避免地,需要对Bitcoin的源码进行修改。网上找过一些Bitcoin源码分析的资源,但大多都是基于C++实现的源码。笔者对C++并不是很熟悉,相反,用Go语言用得更多一些。所以,这个系列的博客会针对Go语言实现的Bitcoin进行分析,也即btcd。因为btc...

2019-01-21 09:36:52 2413

原创 Golang中自动“取引用”和“解引用”对原值的影响

1. 写在前面我们知道Golang在调用方法时,会自动对实参进行“取引用”或“解引用”操作。我们在前面的博客Golang对方法接收者变量的自动“取引用”和“解引用”中也已经讨论了容易引起混淆的解/取引用和接口相关的知识,这里我们将讨论另一个问题:“自动取引用”和“自动解引用”会不会对原值产生影响。我们知道这样一个规则:规则1: 当传递给方法的实参是一个值类型时,原值的内容不会受到影响,因为...

2018-11-09 18:46:24 4771 1

原创 go install/build生成的文件命名和路径

1. 写在前面本文主要讨论go install/build命令生成的文件命令和生成路径问题。将从两种情况讨论:文件夹下只有一个“命令源码文件”文件夹下既有命令源码文件还有其他源码文件以下实验主要在windows环境下完成呢,所以生成的可执行文件以.exe后缀结尾2. 文件夹下只有一个“命令源码文件”假设一个简单的命令源码文件所在的工程组织如下所示:|__ src &n...

2018-11-08 12:53:30 37546

原创 Golang对方法接收者变量的自动“取引用”和“解引用”

1. 写在前面文章的标题读起来是有点拗口的,用一个简单的示例大家便可以一目了然了,如下所示,st2会被自动解引用从而调用StructTest的printData方法,而st3会被自动取引用从而调用StructTest2的printData方法。但很多时候,我们会发现这种自动的“取引用”或“解引用”不“奏效”了,尤其是遇到接口的时候,本文就是通过代码复现这种“不奏效”,并分析其中的原因。pac...

2018-11-07 16:28:58 3491 3

原创 以太坊实战——从nodejs终端使用web3模块

1. 写在前面一直觉得Ethereum相关的开发工具挺繁杂的,网上关于怎么“编写、部署和调用智能合约”的教程也比较多,但这些教程基本上都是基于truffle框架、geth终端等工具进行合约的部署的调用。既然web3只是nodejs环境下的一个JavaScript模块,我一直想通过最简单、纯粹的nodejs环境去直接使用web3,这样能够对web3模块有个比较立体的认识。于是,便有了这篇博文。为...

2018-10-21 01:18:00 9288 4

原创 schroot的安装与使用

schroot的安装与使用什么是schrootschroot使得用户可以在不同的chroot下执行交互命令 Schroot allows users to execute commands or interactive shells in different ——debian wikischroot和chroot的不同 chroot只能被root用户使用,schroot可以被普通用户使用

2017-06-27 20:37:30 4824

原创 Gluster升级遇到的问题

Gluster升级遇到的问题一、问题重现我们已有9台部署有glusterfs3.7.2的服务器(qserver0, qserver1, … qserver8),现在想新加入3台服务器(qserver9, qserver0, qserver11)。11台机器的ip分别是:192.168.0.130, 192.168.0.131, …, 192.168.0.141。我们一直都通过以下方式来安装glust

2016-12-21 15:16:32 2439

原创 GO中调用C代码(CGO)中的坑

GO中调用C代码(CGO)中的坑GO中调用C代码CGO中的坑背景问题重现问题解决背景网上有很多讲解使用CGO实现GO中调用C代码的博客。总结起来,Go中调用C一共有两种办法:第一种是将C代码直接嵌入到GO源文件中第二种是将C代码写在C文件中,再在GO文件中引入第一种实现起来比较顺滑,按照已有的博客教程中的步骤来,基本不会出错。笔者在项目中恰好要用到第二种办法,但是按照博客(http://

2016-08-16 21:33:00 36492 10

原创 leetcode中第三题Longest Substring问题解答算法的可行性证明

一、引入关于leetcode中第三题Longest Substring Without Repeating Characters 问题,网上已有不少解答,并提出了切实可行的算法实现。我在解答该题时参考了http://articles.leetcode.com/2011/05/longest-substring-without-repeating-characters.html和http://www.

2015-10-10 00:05:46 875

原创 变量(对象)“生命期”和“作用域”的关系

一、误解之前一直觉得变量(对象)的“生命期”和“作用域”只是两种不同的表述,其在实质上是统一的:若变量的作用域是全局的,那么其生命期也是从创建时直到程序结束;若变量的作用域是函数局部的,那么其生命期就是从创建到函数调用结束。而之前对于“static”保留字的理解也是:将生命期延长了,同时将作用域扩大了(因为我之前一直误以为作用域和生命期的变化是正相关的)二、新的理解直到看到《C++ primer》(

2015-09-30 11:40:18 748

原创 对“键盘读入”的处理

一、问题的引入最近在练习机试题,遇到一个很棘手的问题:“**从键盘录入一行数据,数据之间用空格分隔,最后以换行符结束**”。之前遇到键盘输入,都是“输入一个数据”之后直接按“回车键”,所以这一块没有像很多。这次正好借这个机会,多思考了以下该类问题。二、问题的解决情形一(2016滴滴出行校招笔试题):从键盘录入一行整数,整数之间用“空格”分隔,最后以“换行符”结束

2015-09-29 11:08:55 631

Android内核剖析

介绍Android内核的好书。讲解从最基本的Linux基础和Java基础入手,深入浅出,易于理解。

2015-03-06

空空如也

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

TA关注的人

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