go 空白标识符
用于抛弃不需要接收的变量值
空白标识符 _作用:在接收多个变量返回时,抛弃不需要的返回值_ 实际上是一个只写变量,你不能得到它的值。这样做是因为 Go 语言中你必须使用所有被声明的变量,但有时你并不需要使用从一个函数得到的所有返回值。
1234567891011121314package mainimport "fmt"func main() { _,numb,strs := numbers() //只获取函数返回值的后两个 fmt.Println(numb, strs)}//一个可以返回多个值的函数func numbers()(int,int,string){ a , b , c := 1 , 2 , "str" return a,b,c}
结果:2 str
a 因为使用 _ 被抛弃
Tendermint 共识源码分析
简述Tendermint的共识算法可以看成是POS+BFT,Tendermint在进行BFT共识算法确认区块前,首先使用POS算法从Validators中选举出Proposer。然后由Proposer进行提案,最后使用BFT算法生成区块。Tendermint 的共识协议使用的gossip协议。
另外,源码分析部分由于代码篇幅太长,会省略部分源码,不影响阅读。
角色Tendermint 共识网络中有两个重要角色
Validator: 网络的参与者,也是区块的验证者(预先配置的网络中的一般验证者账户们)
Proposer: 从validator中选举出一个节点成为出块人(选举出的出块人),选举不需要网络通信,这点后面从源码中说明。
共识5个阶段
NewHeight
propose
prevote
precommit
commit
123456789101112131415161718 +--------------------------------------+ v ...
Tendermint 启动流程
启动流程Tendermint 的启动流程比较清析明了,各业务启动流程都在对应的实现代码,主启动流程加载所需配置,由各启动实现类启动自己对应业务,如节点启动相关在 nodeImpl,共识相关处理是 state 中进行处理。
流程大致:
加载配置 node.NewDefault
启动运行 Start
启动相关实现的 OnStart
先看启动流程
启动入口代码,这里使用到了一个命令行工具:cobra。代码位置:cmd/tendermint/main.go
1234567891011121314151617181920212223func main() { ...省略部份代码 // NOTE: // Users wishing to: // * Use an external signer for their validators // * Supply an in-proc abci app // * Supply a genesis doc file from another source // * Provide their own DB implementatio ...
Tendermint ABCI概述
ABCI 概述 (Application BlockChain Interface)作用让应用程序层 和 共识层进行解耦。可以理解为一套应用程序的接口标准,是应用程序层和共识层进行的桥梁。
应用程序区块链接口(ABCI) 允许用任何编程语言实现应用程序拜占庭容错复制。区块链是多主状态机复制的系统。ABCI是一个接口,定义了复制引擎(区块链)和状态机(应用程序)之间的边界。使用Socket协议,运行在一个进程中的共识引擎可以管理运行在另一个进程中的应用程序状态。以前,ABCI被称为TMSP。
官方github:ABCI
开发动机目前为止,所有的区块链“技术栈”(如比特币)都是作为一个紧耦合的整体进行设计的。 换句话说,每一个区块链技术栈都是一个单独的程序,处理分布式账本的所有问题。 这些问题包括P2P连接、交易内存池广播、最新区块共识、账户余额、图灵完备合约、用户级权限管理等。
在计算机科学中,过高耦合度的程序架构通常不是好做法。 因为耦合度高会导致程序难以复用,并且这样做易导致代码库分叉进而维护困难。 当开发者没有对代码库进行模块化设计并遭受“意大利面代码”的困扰时,这种设计方式导致 ...
go 数组
数组Go 语言数组声明有两种方式
定长数组
不定长度数组
go数组几个注意事项:
默认值:如果没有赋值,会有默认值
int 数组,默认初始化为 0
string 就是空串
数据类型必须相同,不能混用,int数组不能包含float 等,已验证
boolean 是false
数组越界是 panic 异常
数组是值类型,默认情况下是值拷贝,也就是说每次拷贝后是一个独立副本,数组间互不影响。
可以使用指针来实现引用传递
使用格式:
var 数组名 [数组大小]数据类型
1.定长数组1234567891011121314package P01varimport "fmt"func ArrayTest3() { var hens [6]int hens[0] = 111 hens[1] = 222 hens[2] = 333 for i := 0; i < len(hens); i++ { fmt.Printf("打印数组i=%d, 数据=%d\n", i, hens[i]) & ...
Tendermint概述
简单理解为一个分布式状态机
什么是TendermintTenermint是个能够在多机器上安全一致地复制应用的软件。 安全是指无论多达1/3的机器出现何种类型的故障,Tendermint都可以正常工作。一致是指每个正确运行的机器都可以获取完全相同的交易日志并计算相同的状态。 在分布式系统中,安全一致地复制至关重要;从货币到选举再到基础设施管理等广泛应用容错方面,它都有着着重要作用。
拜占庭容错(BFT)指的是系统能够容忍机器以任意方式出现故障,包括机器故意危害系统的方式。拜占庭容错理论已有几十年的历史,但最近由于比特币和以太坊等“区块链技术”的成功,其软件实现才逐渐流行。区块链技术是在更现代的环境下对BFT的一种改造,重点引入了点对点网络和密码认证等技术。区块链的名称来源于交易的处理方式,交易被打包在每一个区块中,每一个区块存储前一个区块的哈希值,形成了一个链的结构。 实际上,区块链数据结构优化了BFT设计。
Tendermint包括两个主要技术组件:区块链共识引擎和通用应用程序接口。共识引擎,被称作Tendermint Core,保证所有的机器按照相同的顺序记录相同的交易。应用程 ...
leveldb-整体架构
前言项目中使用leveldb做为存储,使用过一段时间后,对leveldb进行一个深入的学习,让录本人学习过程中理解。过程中参照网上文章以经实际应用,进行文章输出,如果错漏,还望指正。
整体架构leveldb是一个写性能十分优秀的存储引擎,是典型的LSM树(Log Structured-Merge Tree)实现。LSM树的核心思想就是放弃部分读的性能,换取最大的写入能力。这个很重要,后续深入会发现的leveldb的原理都是基于最大的写入性能去设计的。
LSM树写性能极高的原理,简单地来说就是尽量减少随机写的次数。对于每次写入操作,并不是直接将最新的数据驻留在磁盘中,而是将其拆分成(1)一次日志文件的顺序写(2)一次内存中的数据插入。leveldb正是实践了这种思想,将数据首先更新在内存中,当内存中的数据达到一定的阈值,将这部分数据真正刷新到磁盘文件中,因而获得了极高的写性能(顺序写60MB/s, 随机写45MB/s)。
从图里能看出 LevelDB 主要结构包括:1.内存结构
MemTable
Immutable MemTable 不可变内存结构
2.磁盘文件
Current ...
golang tar包和脚本安装
前言golang 的安装还是比较友好,两种方式安装:
tar包安装
脚本安装
tar包安装一般是直接上官网下载安装,不同版本功能还不一样,也可以使用脚本来快速安装。
https://golang.org/dl
也可以参考官方安装文档https://golang.org/doc/install#install
如果需要其他版本选 Archived versions 可以查看之前的发行版
下载和配置环境变量
wget https://go.dev/dl/go1.19.3.linux-amd64.tar.gzrm -rf /usr/local/go && tar -C /usr/local -xzf go1.19.3.linux-amd64.tar.gz
/etc/profile中添加以下内容
export PATH=$PATH:/usr/local/src/go/bin
验证一下
go version
脚本安装开发环境安装通常使用脚本快速安装
创建文件12touch install.shchmod u+x install.sh
添加脚本脚本会在当前用户 ...
rabbitmq-安装
概述RabbitMQ 基于 Erlang,安装前,需要安装对应版本的 Erlang官网 RabbitMQ 与 Erlang 版本对照表 https://www.rabbitmq.com/which-erlang.htmlCentOS 7 环境下安装
安装安装erlang
查看是否存在旧erlang版本erl -version
若版本低于(version 11.2.2),卸载erlangyum -y remove erlang-*
安装erlang所依赖工具yum -y install make gcc gcc-c++ kernel-devel m4 ncurses-devel openssl-devel
安装 socaterlang内存管理依赖socatyum install -y socat
安装 signing-key,用于和 yum更新源通信rpm --import https://github.com/rabbitmq/signing-keys/releases/download/2.0/rabbitmq-release-signing-key.asc
更新源vi / ...
matic checkpoint理解
概念checkpoint是Matic协议中最关键的部分。它代表了Bor链状态的快照,应该由⅔+的验证器集证明,然后再验证并提交给部署在以太坊上的合约。
这里有几个问题:
checkpoint 是什么
为什么要提交bor的状态,状态中包含哪些信息
checkpoint 验证流程
checkpoint 是什么checkpoint是Matic协议中最关键的部分。它代表了Bor链状态的快照,应该由⅔+的validator集证明,然后再验证并提交给部署在以太坊上的合约。
Heimdall 层允许将 Bor 生成的区块聚合到单个 Merkle 根中,并定期将其发布到以太坊主链。此已发布状态也称为检查点,因此整个过程称为validator(检查点)。检查点提议者最初是通过 Tendermint 的加权循环算法选择的。
checkpoint 结构123456789101112131415161718192021type CheckpointBlockHeader struct { // Proposer is selected based on stake Proposer ...