HashMap源码解析

整体架构HashMap 底层的数据结构主要是:数组 + 链表 + 红黑树。其中当链表的长度大于等于 8 时,链表会转化成红黑树,当红黑树的大小小于等于 6 时,红黑树会转化成链表,整体的数据结构如下: 图中左边竖着的是 HashMap 的数组结构,数组的元素可能是单个 Node,也可能是个链表,也可能是个红黑树,比如数组下标索引为 2 的位置就是一个链表,...

阅读全文

MPT树

前言MPT树,全称Merkle Patria Tree,是以太坊采用的一种经典存储结构。该结构不仅仅被以太坊所使用,像国内金链盟的Fisco Bcos联盟链就将该结构纳入了自身的存储体系。MPT树的概念可以说是很简单,就是merkle + trie,但又因为它是这些知识的综合体,故往往又弄的初学者一头雾水。这里采用一种层层递进的方式将这个MPT树的概念讲清楚...

阅读全文

椭圆曲线签名

ECDSA-secp256k1以太坊数字签名算法使用的是椭圆曲线数字签名算法,英文简称ECDSA。其中EC是“椭圆曲线”的简称,DSA是“数字签名算法”的简称。椭圆曲线算法简单的说就是用X和Y坐标画一个曲线。这个曲线怎么画,需要很多个参数来确定。以太坊使用了一套叫secp256k1的参数确定了椭圆的形状。所以,以太坊的椭圆曲线签名算法全称就是ECDSA-se...

阅读全文

多重签名

前言多重签名:multi-signature,顾名思义就是多个用户对同一个消息进行数字签名。“用N把钥匙生成一个多重签名的地址,需要其中M把钥匙才能执行完成这个地址上的交易,N>=M,这就是M/N的多重签名”。 意义多重签名的作用意义非常,如果采用单独的私钥,尽管以目前的密码学可以保证无法被暴力破解,但是这个私钥不保证会以其他方式(...

阅读全文

Redis持久化之RDB与AOF

前言Redis作为内存型数据库,性能好,读写快。但是难免会遇到进程崩溃或者系统重启的时候,如果此时的内存数据没有被及时的保存,无法恢复,就会消失不见。所以数据的持久化是内存型数据库的重中之重。为此Redis对于数据持久化提供了两种持久化的方案,RDB(Redis DataBase)与AOF(Append Only)。下面我们来详细地了解下两者的区别于选择场景...

阅读全文

Tendermint共识算法流程以及出块顺序的选择

前言Tendermint是Tendermint公司开源的的一个项目,是一个PBFT算法的变体优化,只需要两轮投票就可以完成共识。其本质上是POS+BFT结合的算法。 在上篇文章[PBFT学习笔记]的基础上,本文主要介绍Tendermint共识算法的核心流程和相关证明机制。 算法流程关于 Tendermint 算法的完整描述在这里。 下面这张图是 Tender...

阅读全文

PBFT学习笔记

前言关于拜占庭将军的问题,也很有意思,可以当作故事看看。 PBFT是Practical Byzantine Fault Tolerance的缩写,意为实用拜占庭容错算法。1999年,卡斯托(Miguel Castro)与李斯克夫(Barbara Liskov)提出了实用拜占庭容错算法,解决了原始拜占庭算法效率不高的问题。 PBFT作为一种许可制的一种算法,应...

阅读全文

以太坊state模块分析

前言正如以太坊官方黄皮书所描述的一样:以太坊是一个巨大的状态机,每次交易的执行、区块的产生都是状态的迁移变化。 本文就将围绕以太坊的state模块进行讨论以太坊状态的变化。 关于以太坊中的“状态”状态的定义一个账户对应一个状态,而以太坊是所有状态的集合。比如,最开始的状态是:{A有10元,B有0元},后来A发起了交易,给B2元,状态变成{A有8元,B有2元}...

阅读全文

UTXO模型与Account模型

前言比特币和以太坊在“账户”上实行了不同的账户模型。比特币采用UTXO表示“未花费的交易输出”,而以太坊采用“状态”来维护账户的变化。 比特币的UTXO模型Unspent Transaction Output,译为:未花费交易输出。UTXO是不可拆分的,也就是说使用过之后一定有新的UTXO产生。 举个栗子:A账户有20个BTC(有钱的主儿),口渴了,斥巨资2...

阅读全文

Solidity的Using for的使用

前言其实呢,今天刚接触Using for的时候,我并没有看懂它的意思。官方的文档有些晦涩难懂,导致我也产生了它与import的区别这样的疑问。 使用与import的联系与区别import是讲某个合约contract或者某个库lib导入到当前文件,它是using的前提;import后,当前文件内可以引用被引入文件内定义的library或contract。 举个...

阅读全文