[ethereum源码分析](2) ethereum基础知识
前言
上一章我们介绍了如何搭建ethereum的debug环境。为了更深入的了解ethereum,我们需要了解一些ethereum的相关的知识,本章我们将介绍这些知识。
ethereum相关知识
在学习ethereum的过程中,我们可能会遇到下面的一些知识:
- hash
- merkle tree
- merkle patricia tree
- rlp
Hash(散列函数)
Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射pre-image)通过散列算法变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。(本段来自百度百科>._<)
下面让我们来看看hash的一些特性(想了解更多关于hash的知识请自行百度):
- 可以将输入映射成定长的输出(例如:有两段文本A[长度=100]和B[长度=300],那么他们被hash过后都会生成长度为n的文本)
- 很难找出不同的输入会有相同的输出,也就是说映射成的输出就像指纹一样可以标识该输入。
hash主要是应用在数据的验证、区块的标识、钱包地址中,下面让我们来看看ethereum使用的是什么hash函数:
func rlpHash(x interface{}) (h common.Hash) {
hw := sha3.NewKeccak256()
rlp.Encode(hw, x)
hw.Sum(h[:0])
return h
}
通过上面的代码我们可以看到 sha3.NewKeccak256() 这段代码,那么ethereum中就是用的是 Keccak256 这种hash算法。对于算法我们没有必要深入去研究,我们只需要知道算法的特性是什么就可以了。
Merkle Tree(梅克尔树)
Merkle Tree,是一棵hash树。它的叶子结点是数据,而根节点和子节点都是hash值(关于Merkle Tree的学习,请点击这里)。
Merkle Tree特性:
- 除了叶子节点所有的节点都是hash值
- 知道hash路径,就可以知道数据是否在这颗树上
通过应用Merkle Tree,解决了区块链轻节点上数据验证的问题。
Merkle Patricia Tree(梅克尔帕特里夏树)
Merkle Patricia Tree,对于Merkle Patricia Tree的介绍请点击这里,这篇文章已经说明的相当好了,这里就不再赘述。
Recursive Length Prefix(RLP,递归长度前缀)
Recursive Length Prefix,是一种编码规则。个人觉得数据经过它的编码,实现了一部分的数据压缩,可以减少网络传输数据的大小。对于RLP的介绍,请点击这里。
[ethereum源码分析](2) ethereum基础知识的更多相关文章
- [ethereum源码分析](3) ethereum初始化指令
前言 在上一章介绍了关于区块链的一些基础知识,这一章会分析指令 geth --datadir dev/data/02 init private-geth/genesis.json 的源码,若你的eth ...
- [ethereum源码分析](4) ethereum运行开启console
前言 在上一章我们介绍了 ethereum初始化指令 ,包括了系统是如何调用指令和指令的执行.在本章节我们将会介绍 geth --datadir dev/data/ --networkid cons ...
- Vue.js 源码分析(十二) 基础篇 组件详解
组件是可复用的Vue实例,一个组件本质上是一个拥有预定义选项的一个Vue实例,组件和组件之间通过一些属性进行联系. 组件有两种注册方式,分别是全局注册和局部注册,前者通过Vue.component() ...
- Vue.js 源码分析(十四) 基础篇 组件 自定义事件详解
我们在开发组件时有时需要和父组件沟通,此时可以用自定义事件来实现 组件的事件分为自定义事件和原生事件,前者用于子组件给父组件发送消息的,后者用于在组件的根元素上直接监听一个原生事件,区别就是绑定原生事 ...
- [ethereum源码分析](1) dubug环境搭建
前言 因为最近云小哥哥换了一份工作,新公司比较忙,所以一直没有更新新的博客.云小哥哥新的公司是做区块链的,最近在学习区块链相关的东西(也算是乘坐上了区块链这艘大船).本博客是记录我搭建ethereum ...
- Jquery源码中的Javascript基础知识(三)
这篇主要说一下在源码中jquery对象是怎样设计实现的,下面是相关代码的简化版本: (function( window, undefined ) { // code 定义变量 jQuery = fun ...
- 源码分析:同步基础框架——AbstractQueuedSynchronizer(AQS)
简介 AQS 全称是 AbstractQueuedSynchronizer,位于java.util.concurrent.locks 包下面,AQS 提供了一个基于FIFO的队列和维护了一个状态sta ...
- Jquery源码中的Javascript基础知识(一)
jquery源码中涉及了大量原生js中的知识和概念,文章是我在学习两者的过程中进行的整理和总结,有不对的地方欢迎大家指正. 本文使用的jq版本为2.0.3,附上压缩和未压缩版本地址: http://a ...
- Jquery源码中的Javascript基础知识(二)
接上一篇,jquery源码的这种写法叫做匿名函数自执行 (function( window, undefined ) { // code })( window ); 函数定义了两个参数window和u ...
随机推荐
- swagger 访问格式
boot工程格式如下 http://10.166.10.169:8085/swagger-ui.html 非boot工程加个自己项目名 http://10.166.10.169:8085/xxx/sw ...
- linux 正则表达式 元字符
\b 单词边界 \bcool\b 只匹配cool字符串 [root@MongoDB ~]# cat test.txt i am mike1 i am mike i am mike12 匹配有mike ...
- ubuntu server安装的一些坑
[没有root用户] ubuntu server安装的时候要你新建一个用户,安装完成后,你需要手动开启root. $ sudo passwd root 输入你当前用户的密码 输入你希望的root用户的 ...
- Bootstrap字体图标Font-Awesome 使用教程
转载自:https://blog.csdn.net/crper/article/details/46293295 以备记录使用.
- CSP-J&S 2019游记
$Day -???$ 和爱国爱党的$LQX$书记打了个赌,谁$TG$分低请另一个京味斋. $Day 0$ 机房同学去聚餐,美其名曰"散伙饭",可能又有几个进队的... 我没有去,因 ...
- org.apache.httpcomponents:httpclient 工具类
基于httpclient 版本4.4.1 因为http连接需要三次握手,在需要频繁调用时浪费资源和时间 故采用连接池的方式连接 根据实际需要更改 连接池最大连接数.路由最大连接数 另一个需要注意的是 ...
- 工作日记之查看Linux系统里面的启动频率2017_02_07
链接:http://www.jb51.net/LINUXjishu/19905.html 查看Linux里面的batch: cat /etc/crontab (1)0 19 * * 6 root /d ...
- 给Repeater增加button事件,并绑定值
ASPX页面: 增加两个事件,及传值. 1<asp:Repeater ID="rptList" OnItemDataBound="rptList_ItemDataB ...
- jQuery中$()可以有两个参数
jQuery(expression, [context]) 返回值:jQuery 概述 这个函数接收一个包含 CSS 选择器的字符串,然后用这个字符串去匹配一组元素. jQuery 的核心功能都是通过 ...
- 从零开始配置安装Flutter开发环境
flutter 中文网 https://flutterchina.club/get-started/install/ 1.配置全局环境 PUB_HOSTED_URL=https://pub.flutt ...