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

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

i3wm 更换默认打开的文件管理器

可以通过 xdg-mime 来查询当前默认的文件管理器 xdg-mime query default inode/directory mioto:~/ $ xdg-mime query default inode/directory visual-studio-code.desktop 方法一 还是可以通过 xdg-mime 来设置默认文件管理器 xdg-mime default {file manager}.desktop inode/directory mioto:~/ $ xdg-mime default ranger.desktop inode/directory mioto:~/ $ xdg-mime query default inode/directory ranger.desktop 方法二 我记录有2个 mimeapps.list 文件修改点 ~/.local/share/applications/mimeapps.list, ~/.config/mimeapps.list 选一个修改(没有添加) inode/directory=ranger.desktop 但是我的系统 Manjaro-I3 使用的是 ~/.config/mimeapps.list, 所以有针对性的修改就行

四月 28, 2019 · 1 分钟 · Mioto Yaku

Go反序列化JSON格式化时间

默认得到的序列化后的结果是 {"t":"2018-11-25T20:04:51.362485618+08:00"}, 但如果我想得到 {"t":"2018-11-25 20:04:51"} 该怎么办呢? 方法一 实现 MarshalJSON 接口, 同时可能也需要反序列化, 所以还需要实现 UnmarshalJSON, 以下代码为实现 package main import ( "encoding/json" "fmt" "time" ) type Time struct { T time.Time `json:"t,omitempty"` } func (t *Time) MarshalJSON() ([]byte, error) { type alias Time return json.Marshal(struct { *alias T string `json:"t,omitempty"` }{ alias: (*alias)(t), T: t.T.Format("2006-01-02 15:04:05"), }) } func (t *Time) UnmarshalJSON(data []byte) error { type alias Time tmp := &struct { *alias T string `json:"t,omitempty"` }{ alias: (*alias)(t), } err := json....

十一月 25, 2018 · 2 分钟 · Mioto Yaku

RaspberryZero网络与OTG配置.md

买 Raspberry Zero 的原因呢, 是因为钉钉打卡, 每次可能晚了那么几分钟, 但我就是起不来啊… 这篇文章主要讲三个点 无屏幕 SSH, Static IP, 开启OTG模式 SSH 当然在 ssh 的时候要保证 Raspberry Zero 是有网的状态, 编辑第二个分区 wpa-supplicant 的配置文件 /etc/wpa_supplicant/wpa_supplicant.conf 基本网络配置 network={ ssid="testing" psk="testingPassword" } ssid 无线网络名称, psk 无线网络密码 隐藏网络配置 network={ ssid="testing" scan_ssid=1 psk="testingPassword" } 多个网络配置 network={ ssid="HomeOneSSID" psk="passwordOne" priority=1 id_str="homeOne" } network={ ssid="HomeTwoSSID" psk="passwordTwo" priority=2 id_str="homeTwo" } priority 网络优先级 连接 SSH 如果网络配置没问题的话,现在应该已经连接上了无线网络了, 接下来就是在无屏幕状态下如何 ssh 到 Raspberry Zero 挂载第一分区在 / 目录创建 SSH 文件就可以了, 然后插电启动 Raspberry Zero 等待自动连接到网络后进行后续操作...

十一月 1, 2018 · 1 分钟 · Mioto Yaku

为终端设置代理

现在一般都是使用 SS FQ 了吧, 所以都是 SOCKS5 代理, 但是在终端有些程序是不支持 SOCKS5 的, 比如 go get 方法一 如果你的 SS 目前 Cow 支持的加密算法有: aes-128-cfb, aes-192-cfb, aes-256-cfb, bf-cfb, cast5-cfb, des-cfb, rc4-md5, chacha20, salsa20, rc4, table 安装教程参见 https://github.com/cyfdecyf/cow#快速开始 方法二 如果你用的 SS 加密算法不在以上支持的情况 可以先使用 ss-local 在本地开启 SOCKS5 然后在通过 Cow 将 SOCKS5 转 HTTP

十月 5, 2018 · 1 分钟 · Mioto Yaku