自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

pigff的博客

一个进阶中的程序猿的博客

原创 Go实现设计模式系列(9)——Go实现原型模式

Prototype Pattern(原型模式)原型模式用于创建重复的对象,同时又能保证性能。一般是通过实现 Clone()接口来实现。注意原型模式返回的一定是新的内存实例当直接创建对象的代价比较大时,使用这种模式。例如,一个对象需要在一个高代价的数据库操作之后被创建。我们可以缓存该对象,在下一个请求时返回它的克隆,在需要的时候更新数据库,以此来减少数据库调用。五大要素来看看原型模式的五大要素:模式名称:原型模式目的(What):快速创建一个需要创建的对象的克隆,由此返回一个新的内存实

2020-08-03 16:48:36 27

原创 Go实现设计模式系列(8)——Go实现对象池模式

Object Pool Pattern(对象池模式)对象池模式,对象被预先创建并初始化后放入对象池中,对象提供者,对象提供者就能利用已有的对象来处理请求,减少对象频繁创建所浪费的资源。例如数据库的连接池等等,基本都是创建后就被放入连接池中,后续的查询请求使用的都是连接池中的对象,从而加快了查询速度(不然每次查询都需要重新创建数据库连接对象,比较浪费)。一句话解释,对象池模式下,程序在一开始就创建好了一批可用对象供使用这种模式下,一般有两种角色,即对象池管理者和对象池用户。对象池管理者负责管理整

2020-08-03 15:51:17 22

原创 Go实现设计模式系列(7)——Go实现建造者模式

Builder Pattern(建造者模式)建造者模式使用多个简单地对象一步一步地构建一个复杂的对象。一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。五大要素来看看建造者模式的五大要素:模式名称:建造者模式目的(What):将一个复杂对象的构建分离成多个简单对象的构建组合解决的问题(Why):当一个复杂对象的创建过程基本不变(组合方式),但是该对象的各个部件各自创建的算法经常在变的时候。例如一个复杂对象的创建工作,通常由各个部分的子对象用一定的

2020-07-31 16:27:11 13

原创 Go实现设计模式系列(6)——Go实现单例模式

Singleton Pattern(单例模式)单例模式也是最常见的设计模式之一,这种模式下永远保证返回相同内存位置的同一个实例对象。单例模式一般与两种基础模式,懒汉模式与饿汉模式。懒汉模式即在用到对象的时候再去创建对象,这样如果不用的话就不需要创建该实例对象,是一种时间换空间的做法,需要考虑的是多线程并发调用而导致的会创建多个实例的问题,需要用到互斥锁。饿汉模式即在初始化的时候就实例化好对象,是一种空间换时间的做法,不需要考虑多线程并发调用的问题。Go实现单例模式最常用的有两种模式:采用sy

2020-07-29 13:20:15 36

原创 Go实现设计模式系列(5)——Go实现抽象工厂模式

Abstract Factory Pattern(抽象工厂模式)在抽象工厂模式中创建了一个超级工厂,它提供了创建抽象工厂的接口。比如现在有一个超级工厂,它可以根据传入的参数创建不同的抽象工厂实例。抽象工厂是一个接口,它提供了一组生产一些列产品的方法。比如现在有一个抽象工厂接口,它提供了生产手机和Ipad两种产品的方法。一些普通的工厂实现了这个抽象工厂接口,这就意味着它们都可以生产手机与Ipad,例如华为工厂,小米工厂。只不过华为生产的是华为手机和华为Ipad,小米生产的是小米手机和小米Ipad。抽

2020-07-29 11:22:57 36

原创 Go实现设计模式系列(4)——Go实现工厂方法模式

Factory Method Pattern(工厂方法模式)工厂方法模式解决了简单工厂模式的缺点。之所以能够解决这种缺点,是因为工厂方法模式把具体产品(实例)的创建放到了具体的产品工厂去做。举个例子,现在有一个玩具工厂,在简单工厂模式中,它分别生产拼图和弹珠两种玩具,这两种玩具都是由这个玩具工厂一手创建的。而在工厂方法模式中,相当于玩具工具工厂底下还有两个子工厂,分别是拼图工厂和弹珠工厂,拼图和弹珠两种玩具的创建由这两个子工厂管理。在这种情况下,玩具工厂只是一个接口,包含了New()方法,而拼图工厂

2020-07-28 11:29:39 24

原创 Go实现设计模式系列(3)——Go实现简单工厂模式

Simple Factory Pattern(简单工厂模式)简单工厂模式属于创建型模式,不会对外暴露创建对象的逻辑,并且我们通过一个共同的接口来创建不同的对象。形象地理解就是,使用同一个工厂,可以创建出不同的产品,比如玩具工厂,可以生产出不同的玩具。五大要素来看看New模式的五大要素:模式名称:简单工厂模式目的(What):定义一个创建具体对象的工厂,有工厂调用者自己决定创建哪个对象解决的问题(Why):当我们明确知道不同地条件下需要创建不同的对象时,使用这种模式解决方案(How):通

2020-07-28 10:52:29 22

原创 Go实现设计模式系列(2)——Go实现New模式

New Pattern(New模式)这几乎是我们最常用的模式,因为太常用了,以致于我们并没有它当成一种模式。New 模式属于创建型模式的一种,作为最基础的创建型模式而被我们广泛使用五大要素来看看New模式的五大要素:模式名称:New模式目的(What):使用类似New()/new()/NewXXX()之类的方法,返回一个实现了某个接口的对象的引用(地址)解决的问题(Why):当我们想简单获取实现某个接口的对象的引用时,使用该模式解决方案(How):New()/new()/NewXXX(

2020-07-28 10:13:37 30

原创 Go实现设计模式系列(1)——设计模式介绍

设计模式就是老一辈的程序员们在写代码的时候,在特定环境下,对重复出现的一系列编程问题,总结出来的一套写代码的模式。在针对某种问题时,采用特定的设计模式实现,往往能够让写出来的代码更好看,更有效,更可靠,写代码的速度更效率。

2020-07-27 11:41:07 57

原创 Hyperledger Fabric从源码分析事件机制(二)

上篇文章——Hyperledger Fabric从源码分析事件机制(一),我从 cmd 中添加--waitForEvent参数去监听事件这一入口出发,分析了DeliverClient这一侧的相关源代码,接下来这篇文章将会解析DeliverServer这一侧的相关源代码,准备好上车了兄弟们。从proto文件中发现DeliverServer事件相关的pb.go文件在protos/peer/events.pb.go中,关于DeliverServer的部分在576行:// DeliverServer is

2020-07-01 17:57:28 148

原创 Hyperledger Fabric从源码分析事件机制(一)

Fabric 允许应用程序在调用链码的时候监听链码中设置的事件,在监听到相应的事件后做相应的处理过程。Fabric1.4 中的事件机制与老版本的事件机制源码部分有所不同,用的是Deliver的方式,所以老版本的代码与 Fabric1.4 版本的代码会有所不同。本文将从源码解析整个事件机制的处理流程的。回顾链码调用源码链码调用监听事件部分代码在之前的文章——Hyperledger Fabric从源码分析链码查询与调用,我有提到在ChaincodeInvokeOrQuery()函数中有对是否等待链码

2020-07-01 15:29:13 193

原创 Hyperledger Fabric从源码分析链码容器启动过程

链码容器启动过程每个实例化之后的链码都会以容器的形式启动起来,下面举一个byfn.sh启动的例子:$ docker psCONTAINER ID IMAGE COMMAND CREATED STATUS

2020-06-30 16:55:36 152

原创 Hyperledger Fabric从源码分析背书提案过程

在之前的文章中Hyperledger Fabric从源码分析链码安装过程Hyperledger Fabric从源码分析链码实例化过程Hyperledger Fabric从源码分析链码查询与调用都提到了类似下面这一行的代码proposalResponse, err := cf.EndorserClients[0].ProcessProposal(context.Background(), signedProp)这一行代码是由客户端向背书节点发起背书提案申请,获取背书响应的过程,即客户端应用程

2020-06-29 17:28:00 94

原创 Hyperledger Fabric从源码分析链码查询与调用

前面分析过了链码的安装与实例化,今天来分析一下链码的调用和查询。因为这两个命令最终在底层调用的都是同一个函数,因此我们将这两个链码执行过程放在一起解析。同样,还是有很多函数会和之前所讲的具有相同的功能,在本文中就不做详细说明,可以翻看之前的两篇文章:Hyperledger Fabric从源码分析链码安装过程Hyperledger Fabric从源码分析链码实例化过程好了,下面就开始吧下面的解析以 invoke 为例链码调用源码解析源码入口在 peer/chaincode/inv

2020-06-28 17:26:55 173

原创 Hyperledger Fabric从源码分析链码实例化过程

上篇文章——Hyperledger Fabric从源码分析链码安装过程,分析了链码安装的大致过程,这篇文章分析一下链码实例化的过程,其中有一部分的代码非常相似,类似的函数解析我就不再展开了,可以直接看链码安装文章的相关介绍。好了下面就开始吧。链码实例化源码解析相关源码入口在peer/chaincode/instantiate.go中先给一个官方实例化的例子吧peer chaincode instantiate -o orderer.example.com:7050 --tls true --ca

2020-06-28 15:13:35 355

原创 Hyperledger Fabric从源码分析链码安装过程

用了 Fabric 也有一个多月了,写过使用过其中的链码,但是还没有搞清楚链码从安装到实例化,再到链码调用的整个具体流程是怎样的。接下来会写几篇文章,从源码角度来分析一下链码,本篇文章就先来分析一下链码的安装过程。本文源码剖析都是在 Fabric1.4 版本中解析如何找到链码相关的源码入口在源码文件结构中,peer 目录是 peer 有关的命令的相关解析,它下面每一个目录都对应着一个子命令,例如 chaincode 目录对应的就是 peer chaincode相关的命令,当然下面还会有一些子命令,

2020-06-28 13:55:35 87

原创 Hyperledger Fabric私有数据

参考资料:官方文档——私有数据官方文档——私有数据定义官方文档——在Fabric中使用私有数据文章目录什么是私有数据什么是私有数据集(PDC)什么时候使用通道,什么时候使用集合私有数据的交易流程私有数据收集器的定义私有数据分发从链码中引用集合在链码中传递私有数据私有数据的访问控制查询私有数据私有数据的删除升级一个集合定义如何在 Fabric 中使用私有数据什么是私有数据在没有私有数据之前,在一个通道上的所有组织成员都可以访问通道账本上的数据(每个 peer 节点都是记账节点,需要记账)。如果

2020-06-11 13:21:16 113

原创 Hyperledger Fabric访问控制列表(ACL)

参考资料:官方文档——访问控制列表(ACL)文章目录访问控制列表(ACL)是 What资源策略`Signature` 策略`ImplicitMeta` 策略在哪里定义访问控制权限如何在 `configtx.yaml`中格式化ACL更新 `configtx.yaml`中的默认 ACL从源码来看ACL访问控制列表(ACL)是 What之前写了很多文章一直没有介绍访问控制列表(以下统称为 ACL )这个东西,在 peer node start命令源码很前面的地方就有 ACL 相关的代码。这是 Fabr

2020-06-10 17:11:58 143

原创 Hyperledger Fabric从源码分析账本

参考资料:官方文档——账本关键概念Fabric源码分析之九数据库存储源码分析leveldbfabric源码解析5——kvledger初始化文章目录什么是账本?世界状态区块链命名空间源码分析idStorehistorydbProviderledgerStoreProvidervdbProvider账本存储目录结构什么是账本?Fabric 中的账本存储了有关业务对象的重要事实信息,既包括了对象属性当前的值,也包括产生这些当前值的交易的历史。这两个概念可以用下面的术语来概括,即账本包括

2020-06-04 10:19:31 193

原创 Hyperledger Fabric从源码分析系统链码

系统链码简介在 Fabric 中,有一些链码是比较特殊的,叫系统链码。它们作为peer进程的一部分运行,而不是像用户链码一样运行在独立的 docker 容器中。因此它们有更高的权限来访问 peer 中的资源来实现用户链码难以实现或者不能实现的功能。在 Fabric 1.4 版本之前,总共有五种系统链码,它们分别是:Life Cycle System Chaincode (LSCC):生命周期系统链码Configuration System Chaincode (CSCC):配置系统链码Query

2020-06-03 13:54:47 164

原创 Hyperledger Fabric身份

参考资料:官方文档——身份什么是身份区块链网络中的不同参与者包括 Peer 节点、排序节点、客户端应用程序、管理员等等,这些参与者都一个封装在 X.509 数字证书中的数字身份。这些身份决定了参与者在区块链网络中对资源的确切权限和对信息的访问权限。数字身份还有一些额外的属性,Fabric 使用这些属性来确定权限,并为身份和相关属性的联合提供了一个特殊的名称——主体。主体与 userid 或 groupid 类似,但是更加灵活,因为它们可以包含参与者身份的广泛属性,比如参与者的组织、组织单元、角色,甚至

2020-05-25 10:41:45 96

原创 Hyperledger Fabric区块链网络

参考资料:官方文档——区块链网络1. 什么是区块链网络区块链网络是为应用程序提供账本和智能合约服务的技术基础设施。首先,智能合约用于生成交易,这些交易随后被分发到网络中的每个节点,并在每个节点的账本副本上记录下来并且是不可篡改的。这个应用程序的用户可能是使用客户端应用的最终用户,或者是一个区块链网络的管理员。多个组织作为一个联盟(consortium)聚集在一起形成网络,它们的权限由一组策略决定,这些策略在最初配置网络时由联盟商定。此外,网络策略可以随着时间的推移而变化,这取决于联盟中的组织的协议。

2020-05-22 17:12:06 282

原创 Hyperledger Fabric更新通道配置

参考资料:官方文档——更新通道配置官方文档——向通道内添加组织1. 什么是通道配置通道配置包含关于通道管理的所有信息。最重要的一点是,通道配置指定了哪些组织是通道的成员。但同时它也包含了其他通道范围的配置信息,例如,通道访问策略和区块的批处理大小。这个配置被存储在账本的一个区块里,因此被称为配置(config)区块。每个配置区块包含一个配置。这些区块中的第一个就是创世区块,包含启动通道所需要的初始配置信息。对通道的每次配置修改都是通过新配置一个区块完成的。也就是说,想要修改一个通道的配置,

2020-05-21 16:48:35 440

原创 Hyperledger Fabric从源码分析交易

在上一章Hyperledger Fabric从源码分析区块结构中提到了区块的概念,并从源码角度对区块的结构进行了剖析,知道一个简单的区块包含了下面几个部分BlockHeader, 区块头BlockData,区块数据BlockMetaData,区块元数据上篇文章中已经对区块头,区块数据,区块元数据各个字段的内容进行了分析。我们知道BlockData字段是一个切片,存储的是一条条交易,但是并没有对交易具体的结构进行剖析。那么这篇文章就来分析一下一条交易里面会有哪些东西。1. 先猜想一下一条交易会有

2020-05-20 14:47:36 306

原创 Hyperledger Fabric从源码分析区块

学习区块链的这段时间内,一直在想区块本身到底包含了哪些数据,今天就Fabric的源码来分析一下,一个区块底层到底包含了哪些数据。1. 凭感觉猜想一个区块中可能会有哪些数据首先会想到,区块本身存储的数据,它里面存储着一些交易。其次,区块之间是以哈希连接成区块链的,按我之前的学习知识来看,它会需要包含上一个区块的hash。另外,当然不能少了它本身数据的哈希。还有很重要的一点,需要有一个区块的序号,是用来标记区块高度的。暂时能想要的就是这些,看些fabric源码 release-1.4版本中的区块结构

2020-05-20 11:52:38 288

原创 Hyperledger Fabric配置文件解析(二)——configtx.yaml

1. 组织结构配置文件configtx.yamlconfigtx.yaml主要用来配置fabric的组织结构,通道及锚节点的配置。它主要完成以下几个功能生成启动 Orderer 需要的创世区块orderer.block(genesis.block)创建应用通道所需的配置交易文件生成组织锚节点更新配置交易文件2.具体的文件配置信息把注释全部去掉,看起来应该会清晰一点Organizations: - &OrdererOrg Name: OrdererOrg

2020-05-19 16:42:11 361

原创 Hyperledger Fabric配置文件解析(一)——crypto-config.yaml

1. 相关配置文件介绍crypto-config.yaml,用于生成相关组织的私钥和证书configtx.yaml对相关组织进行配置配置orderer,用以生成orderer端初始化时所需的block(Genesis Block)配置channel,用以生成创建channel时所需的tx文件core.yaml,peer端的配置文件orderer.yaml,orderer端的配置文件docker-compose.yaml,用以配置fabric网络的相关容器下文中所有的配置文件解析

2020-05-19 14:30:00 417

原创 Hyperledger Fabric的网络拓扑图与交易流程

1. Fabric中的四种节点客户端节点介于应用程序与底层之间,是两者之间交互的媒介节点。它不能独立存在,必须与Orderer节点与Peer节点建立连接,才可以发挥作用,比如连接到Orderer节点进行通道创建,连接到Peer节点进行交易模拟执行Peer节点Peer节点是一个统称,包含了Anchor(锚节点),Endorser(背书节点)以及Committer(记账节点)Anchor锚节点是与组织密切关联的。一个组织内部可能会有多个Peer节点,但是只会有一个Anchor锚节点,它是组织内部唯一与

2020-05-15 16:33:34 240

原创 Hyperledger Fabric概述与整体架构

1. 项目介绍Hyperledger Fabric是IBM发起的,后来被Linux基金会托管,作为开源的区块链项目Hyperledger Fabric的主要目标是作为企业级联盟链的基础设施,它的基础架构与公有链有很大的不同Hyperledger Fabric现阶段拥有可插拔的共识机制,包含solo与kafka两种机制2. 智能合约(链码,chaincode)最初引入智能合约这个概念的是以太坊项目3. Hyperledger Fabric 整体架构图整体架构分为应用程序层与底层的区块链层应用

2020-05-15 15:51:23 131

原创 用比特币更好地理解区块链

1 区块链是什么区块链是一个分布式数据库,具备分布式存储、分布式记录、去中心化、分布式维护等特性区块链1.0 可编程货币:数字化货币及支付系统区块链2.0 可编程金融:股票、清算、私募、股权等金融领域区块链3.0 可编程社会:公正、仲裁、审计、物流、医疗等领域区块链应用做为人熟知的就是比特币。1.2 区块链核心技术密码学和数字签名用于身份地址标识共识算法用于工作量证明分布式存储技术用于存储交易记录和区块,分布式网络技术用于网络通信和节点发现1.3 区块链本质区块链本质是一个分

2020-05-15 09:21:11 120

原创 Docker容器与容器云学习笔记——client与daemon(一)

1. docker的整体工作流程docker本身其实是一个server的形式存在着的,叫做docker daemon,也叫做dockerd,那么怎么与这个server进行通信呢?当然想到要用一个client客户端,client客户端有很多种形式,比如我们经常在命令行敲的docker工具,它就是一个client,另外比如windows或mac系统装的桌面版docker,那也是客户端(这个也可以操控...

2020-04-10 11:37:06 94

原创 Docker容器与容器云学习笔记——cgroup

cgroups(control groups)资源控制组,它不仅可以限制被namespace隔离起来的资源,还可以为资源设置权重、计算使用量、操控任务(进程或线程)启停等。一般来说,cgroup(单数形式)用于指定整个功能,当需要明确表示多个资源控制组的时候,用cgruops(复数形式)。以下根据Docker容器与容器与描述统一使用cgroups1. cgroups是什么官方定义如下:内...

2020-04-09 10:29:25 177

原创 Docker容器与容器云学习笔记——namespace

namespace隔离资源的6个方面namespace系统调用参数隔离内容隔离目的UTSCLONE_NEWUTS主机名与域名以便在网络中标识自己IPCCLONE_NEWIPC信号量、消息队列和共享内存以便进程间通信PIDCLONE_NEWPID进程编号以便与宿主机的PID进行隔离NetworkCLONE_NEWNET网络设备、网络栈...

2020-04-07 20:52:22 212 2

原创 beego根据数据库模型一键生成models

bee api 项目名-conn="用户名:密码@tcp(IP地址:3306)/数据库名?charset=utf8"

2019-10-18 15:39:22 1273

原创 GO学习笔记——错误处理(22)

C++中通过异常机制来处理一些异常的情况,这是C++错误处理的方式。GO语言中,有专门的error类型来表示错误,这也是一种内置类型,它一般作为某些函数返回参数的第二个参数,来判断函数的调用是否出错,并可以将出错原因赋值给error类型的变量。func main() { f,err := os.Open("test.txt") if err != nil { fmt.Printl...

2018-11-19 09:54:01 185

原创 GO学习笔记——defer调用(21)

defer调用也是一种流程控制语句,经常用来调用一些资源处理函数。defer语句确保被执行的语句具有下面的调用时机defer调用必须出现在函数内,并且在该函数返回之前才回去执行defer调用的函数 给一个示例来看一下func testdefer(){ defer fmt.Println("calling last") fmt.Println("calling first"...

2018-11-07 17:24:52 153

原创 GO学习笔记——函数式编程(20)

在C中,我们有函数指针,函数指针可以作为参数传递给一个函数。但是,在GO中,支持函数式编程,也就是说,它支持下面这个概念头等函数:可以把函数赋值给变量,也可以把函数作为其他函数的返回值或者参数所谓的函数是一等公民,也就是这么个意思。匿名函数 所谓的匿名函数,就是没有名字的函数。这和我们平时所了解的可能不一样,为什么一个函数可以没有名字?但这在函数式编程中,确实是可行的,因为...

2018-11-06 15:03:20 159

原创 GO学习笔记——接口(19)

什么是接口?在面向对象的领域里,接口一般这样定义:接口定义一个对象的行为。接口只指定了对象应该做什么,至于如何实现这个行为(即实现细节),则由对象本身去确定。在GO语言中,比如说我定义了一个接口download,它内部有一个方法get,任何类型只要定义了这个get方法,就是实现了这个接口。不管类型内部怎么定义这个get方法,只要定义了,也就是说外部可以调用这个方法,这就算实现了这个接口。...

2018-11-05 15:20:08 124

原创 GO学习笔记——组合(18)

GO只支持封装,不支持继承,那么如果我们想要对其他包上的一些类型进行扩展,比如说在原有结构体上加上一些自己的东西,C++中可以用继承实现,但是GO没有,所以GO引入了组合,用组合来实现继承的功能,同样起到代码复用的效果。如果我们想在本包中使用别的包中的类型,但又不想使用它的名字,使用别名就可以搞定。如果想要在本包中使用别的包中的类型,同时想在此基础上,添加一些功能和内容,就可以使用组合,下...

2018-11-02 14:43:00 102

原创 GO学习笔记——包和封装(17)

既然GO支持封装,那么相比于C++的三大访问属性:private,protected,public,GO只有private和public,因为protected是因继承而产生的。而C++的访问属性是根据类来说的,在一个类中相当于外界的属性;但是GO中没有类,GO中的访问属性是相对于包来说的,这一章就来讲一讲GO中的包,以及包是怎么做到封装的。包其实相当于一个目录,如果我们把所有的源文件写在一个...

2018-11-02 11:32:52 370

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