[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 ...
随机推荐
- webservice的一些理解
web services中如果用.NET的话,DataSet可以作为与客户端交互的一个返回值,因为DataSet实质上是XML.而SOAP WSDL等都是基于XML的. --------------- ...
- curl基本用法
curl 是一种命令行工具,作用是发出网络请求,然后获取数据,显示在"标准输出"(stdout)上面. 以下是博主整理的一些关于curl命令的基本用法. -A/--user-age ...
- 指定pom文件jdk版本
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> ...
- Linux hostname 主机名篇
主机名修改(以主机名为config为例) 1.修改文件/etc/sysconfig/network,内容为 [root@config ~]# cat /etc/sysconfig/network# C ...
- java8-----lambda语法
// -----lambda语法1------ https://www.baidu.com/link?url=6iszXQlsmyaoWVZMaPs3g8vLRQXzdzTnKzQYTF8lg-5QQ ...
- 18: vue-element-admin使用
1.1 vue-element-admin使用 1.使用参考网站 1)官方演示环境: https://panjiachen.github.io/vue-element-admin/#/dashboar ...
- Dungeon Master (三维bfs)
You are trapped in a 3D dungeon and need to find the quickest way out! The dungeon is composed of un ...
- Restful风格API中用put还是post做新增操作有什么区别?
Restful风格API中用put还是post做新增操作有什么区别? 转 头条面试归来,有些话想和Java开发者说!>>> 这个是华为面试官问我的问题,回来我找了很多资料,想验证这个 ...
- Hangfire
参考 开源分布式Job系统,调度与业务分离-如何创建一个计划HttpJob任务
- Lock和synchronized的区别和使用(转发)
今天看了并发实践这本书的ReentantLock这章,感觉对ReentantLock还是不够熟悉,有许多疑问,所有在网上找了很多文章看了一下,总体说的不够详细,重点和焦点问题没有谈到,但这篇文章相当不 ...