Hyperledger Fabric peer block 的交付流程详解

本文基于 hyperldeger fabric 1.4.7 进行代码追踪讲解 假设场景描述: peer 重启场景 peer 有 user channel peer 使用的是 goleveldb peer 的 core.peer.gossip.orgLeader 为 true 流程简介 初始化账本根据账本中保存的 channel id 创建通道实例, 并初始化与之对等的 gossip 服务, 用 来接收对应通道的最新的 配置或交易 block, 接收到 block 后, 经过 Verify, Validate, Validate RW sets 三个验证步骤, 提交给 Ledger Commiter 进行写入文件, 并将当前通道的 blkMgrInfo 更新到最新状态 源码追踪 伊始: main -> node.Cmd -> startCmd -> nodeStartCmd -> serve peer.Initialize 文件: core/peer/peer.go:241 初始化 ledgermgmt, 里面做的事情太多了, 要讲清楚有点困难建议大家自己去看看, 里面主要做的就是 各种初始化工作 // /var/hyperledger/production/ledgersData 下有这些东西, 这里面的工作跟此目录有关 // chains/index goleveldb: 保存了所有通道的最新状态信息 // fileLock goleveldb: 用于锁程序的,文章最末尾有介绍 // historyLeveldb goleveldb: 保存历史交易的 // ledgerProvider goleveldb: 保存的是 chain ids, 也就是通道id // pvtdataStore goleveldb: 存储私有数据库 // stateLeveldb goleveldb: 世界状态数据库, 可以替换为 couchdb // 这两个我不确定没有细追 // configHistory 看名字应该是保存了 config block 相关的东西....

六月 15, 2020 · 4 分钟 · Mioto Yaku

Go 删除 Slice 中的某一个值

方法一 优点: 速度最快 缺点: 会导致切片数据顺序改变 a := []string{"A", "B", "C", "D", "E"} i := 2 a[i] = a[len(a)-1] // 将数组的最后一位赋值给需要删除的 index 上 a = a[:len(a)-1] // 移除掉最后一个没用的数据 // Output: // [A B E D] 方法二 优点: 速度会随着切片长度改变 缺点: 保持原有切片顺序 a := []string{"A", "B", "C", "D", "E"} i := 2 a = append(a[:i], a[i+1:]...) // Output: // [A B D E] Benchmark goos: linux goarch: amd64 pkg: github.com/yakumioto/go-example/benchmark/delete-element-slice Benchmark1 Benchmark1-4 1000000000 0....

六月 3, 2020 · 1 分钟 · Mioto Yaku

基于 Windows 的开发环境

换电脑啦!!!退役了用了 6 年的笔记本!!!由于未知错误原因导致无法安装 Manjaro Linux,所以决定尝试使用 Windows 进行开发。 由于最开始并没有考虑使用 Windows 所以显卡选择比较随意 GTX 1660 Super,导致无法玩大作,后悔啊!!! 目前的开发工具主要是: JetBrains Goland Microsoft VSCode (主要用来编辑一些非项目的文件,如 Terminal 的配置文件等) Windows Terminal (主要用于打开 WSL2 子系统的,偶尔用来开 PowerShell) Windows Ubuntu WSL2 (用来 编译,调试 项目,启停 docker) Docker For Windows (WSL2 中操作 docker 容器 都会启动在这个里面) Chocolatey (类似 Linux 中的包管理工具,如 Ubuntu 的 apt) VirtualBox (甲骨文的虚拟机软件,如创建一个 Kubernetes 集群什么的) Vagrant (虚拟机管理工具,如用于一键启动 Kubernetes 集群) Putty (SSH 客户端) 以上就是我目前主要用到的开发工具。 Chocolatey https://chocolatey.org/ 无意中接触到的一个工具,很对胃口所以就决定尝试一下了。 安装也很简单,以管理员模式启动 PowerShell.exe,然后执行一下命令就可以了。 Set-ExecutionPolicy Bypass -Scope Process -Force; [System....

三月 25, 2020 · 2 分钟 · Mioto Yaku

Fabric 中 etcdraft 共识讲解

为什么要通过 etcdraft 来进行共识? 我觉得有以下原因 solo 并不适合大多数场景, 例如: 组织A, 组织B, 都想在自己放置共识节点 kafka 虽然能满足以上需求, 但是 kafka 加上 zookeeper 需要额外部署并且实在是太重了, 不方便部署 所以基于 etcdraft 的共识来了, 解决了以上的痛点 重要的话说三遍! 千万不要错过文章中的源码部分, 里面有很多很多的注释!!! 千万不要错过文章中的源码部分, 里面有很多很多的注释!!! 千万不要错过文章中的源码部分, 里面有很多很多的注释!!! 核心接口 以下是我认为实现 etcdraft 共识核心的接口 // ClusterServer 集群Server接口 type ClusterServer interface { Step(Cluster_StepServer) error } // ClusterClient 集群Client接口 type ClusterClient interface { Step(ctx context.Context, opts ...grpc.CallOption) (orderer.Cluster_StepClient, error) } // Handler 用于共识的两个接口 type Handler interface { OnConsensus(channel string, sender uint64, req *orderer.ConsensusRequest) error OnSubmit(channel string, sender uint64, req *orderer....

一月 15, 2020 · 8 分钟 · Mioto Yaku

回顾 2019

第一次写年终总结, 每次准备写脑海里都飘过 “你比上一年又重了N公斤”, 今年可以写的感觉也并不多, 但是总结一下总是好的. 体重 涨幅 0.052, 目前体重算 95KG 好了, 另外明年的目标一定要下降到 70 左右!!! 加薪 涨幅 0.428, 虽然加薪来的迟了, 但是总比没有要好. 学习 虽然 Hyperledger Fabric 国密支持并不是我实现, 但是我也充分参与到了其中, 算是对 TLS, 加密, 签名, 证书 有了较为深入的研究. 完成了对 Hyperledger Fabric statedb 的扩展, 支持了 TiDB. 部署实施了两个 Hyperledger Fabric 的落地项目. 对 Hyperledger Fabric 以及 Hyperledger Fabric Go SDK 有了较为深入的了解. 给 Hyperledger Fabric Go SDK 贡献了2次源码, 支持了 Java Chaincode 的 安装, 实例化, 升级. 编写了 hlf-deploy 项目, 支持了几乎所有的 Hyperledger Fabric 所有的操作, 例如: 动态更新通道, 动态切换共识算法 等....

一月 2, 2020 · 1 分钟 · Mioto Yaku

Go 100 行实现 HTTP(S) 正向代理

目标是现实一个 HTTP HTTPS 的代理服务器, 目前代理的实现方法有两种 普通代理: 这种代理扮演的是中间人角色, 对于客户端来说, 它就服务器, 对于服务端来说, 它是客户端, 它负责在中间来回传递 HTTP 报文 隧道代理: 它是通过 HTTP 正文部分(body) 完成代理, 以 HTTP 的方式实现基于 TCP 的应用层协议代理, 这种代理使用 HTTP 的 CONNECT 方法建立连接 这是一次 HTTP 的请求, 用 \r\n 进行换行, 碰到连续两个 \r\n 后内容为请求数据, 分为以下几个部分 请求行 (request line) 请求头 (header) 空行 请求数据 (body) curl -Lv http://baidu.com > GET / HTTP/1.1 > Host: baidu.com > User-Agent: curl/7.68.0 > Accept: */* > * Mark bundle as not supporting multiuse < HTTP/1....

八月 21, 2019 · 2 分钟 · Mioto Yaku

破解某Wi-Fi探针魔盒的过程

有个老同学,在老家做销售工作, 某一天忽然联系我说我有个路由器可以扫描周边的 MAC Address 直接得到手机号,我一听这个牛逼啊,然后就让把路由器发来玩玩了 这东西有两个部分一个是手机应用程序,一个是路由器。 App抓包 最初设想路由器既然要用 Wi-Fi 手机当作热点数据必定经过手机,说干就干,下载了个 HttpCanary 然后对 App 抓包 过滤掉没用的接口后得到了两个核心接口(说真的 App 设计的真心让人恶心,所有权限都要可能为了读取手机上的联系人把) 用来获取已经匹配到的手机号的接口 GET http://x.hnyzlp.com/api/merchart/Operative/phone 用来设置心跳的接口,同时设置经纬度 GET http://x.hnyzlp.com/api/merchart/Operative/set_address 到此为止并没有 MAC 实际发出的地址, 所以由此可证明路由器直接将数据发送到了远端服务器,这条路被斩断了 路由器抓包 起初想的是通过 ARP 诈骗让自己家的路由器把数据发送到我指定的设备来实现抓包,但是!Mac 下各种问题,搞了一个多小时没搞定,卒! 后来想起来我的路由器是可编程的啊!,于是乎找了个 AC68U 可用的 tcpdump 路由器上抓指定网卡的的指定IP,然后!又得到了两个核心接口 用来设置路由器心跳, 一分钟请求一次 获取路由器上的运行时间, ARM 状况 等。 POST http://api.swsf3.cn/api_v1/remotecontrol 用来发送 mac 地址到服务端, 频率是 30 秒一次 POST http://api.swsf3.cn/api_v2/report 由此可见所有东西都全了!, 上传数据的接口, 以及查看数据的接口

六月 7, 2019 · 1 分钟 · Mioto Yaku

部署 Kubernetes 遇到的问题

Unable to update cni config: No networks found in /etc/cni/net.d 由于设置了代理导致的错误, kubelet 无法通过代理链接到 kube-apiserve 解决办法: unset http_proxy https_proxy # or export no_proxy=<your_kube_apiserver_ip> port 10251 and 10252 are in use 多次 init 导致的错误 解决办法: kubeadm reset ROLES none 关于 ROLES <none> 的问题, 据说在 kubeadm join 的时候可以指定, 不过我每次都没看.. 解决办法: # 添加标签 kubectl label node {node name} node-role.kubernetes.io/{key}={value} # example kubectl label node host2 node-role.kubernetes.io/node2=node2 # 删除标签 kubectl label node {node name} node-role.kubernetes.io/{key}- # example kubectl label node host2 node-role....

五月 29, 2019 · 1 分钟 · Mioto Yaku

Go HTTP POST 附件

前段时间为了使用 adb 进行钉钉打卡, 写了个 Go 的程序, 想着万一没打上怎么办, 不如截个图发给自己(现在以 root, 辣鸡钉钉), 文章只为了记录一下实现. // curl -X POST https://example.com/sendPhoto -F photo=@./screen.png // 以下代码是根据以上 curl 命令的实现 buf := &bytes.Buffer{} mu := multipart.NewWriter(buf) part, err := mu.CreatePart(textproto.MIMEHeader{ "Content-Disposition": []string{`form-data; name="photo"; filename="screen.png"`}, "Content-Type":[]string{"application/octet-stream"}, }) checkError(err) fp, _ := os.Open("/home/mioto/screen.png") io.Copy(part, fp) mu.Close() req, err := http.NewRequest(http.MethodPost, "https://example.com/sendPhoto", bf) checkError(err) req.Header.Set("Content-Type", mu.FormDataContentType()) res, err := http.DefaultClient.Do(req) checkError(err)

五月 16, 2019 · 1 分钟 · Mioto Yaku

Go 解析 ECPrivate Key 遇到的问题

最近在做 fabric 证书私钥管理系统, 遇到的一个问题, 在使用 x509.ParseECPrivateKey() 方法的时候会直接报错, 而 fabric 确实用的是 椭圆曲线算法 错误输出: x509: failed to parse EC private key: asn1: structure error: tags don't match (4 vs {class:0 tag:16 length:19 isCompound:true}) {optional:false explicit:false application:false private:false defaultValue:<nil> tag:<nil> stringType:0 timeType:0 set:false omitEmpty:false} @5 原因是 fabric 将私钥转成 pem 格式的时候使用的方法是 x509.MarshalPKCS8PrivateKey() 解决办法 block, _ := pem.Decode(pemBytes) key, err := x509.ParsePKCS8PrivateKey(block.Bytes) checkErr(err) switch priv := key.(type) { case *ecdsa.PrivateKey: // do something }

五月 7, 2019 · 1 分钟 · Mioto Yaku