
以太坊
刘小京
the best way to learn is by making mistakes!
展开
-
leveldb数据库的put ,get ,compaction操作总结
之前排查智能合约执行返回0x的问题,涉及到数据库部分的内容,就把leveldb的3个主要操作介绍一下。在此之间先介绍下leveldb中的文件类型。文件类型文件类型总共有5种:log, ldb, CURRENT, MANIFEST,LOG。 另外还有一部分内存缓存。内存缓存:memtable。默认是32M大小。memtable写满之后会转为frozenmemtable,用于写入数据库l...原创 2019-01-10 16:07:35 · 671 阅读 · 10 评论 -
leveldb数据库的memcompaction操作源码
之前介绍了leveldb数据库的put和get操作。put操作将数据写入内存并记录log就算完事,但内存并不是无限的,还是需要将内存中的数据写入到磁盘中的,完成这一步的操作叫做memcompaction。而get操作的过程需要根据key的范围进行搜索定位到某一个文件中,如果仅是将内存数据写入到磁盘文件中,虽然key在单个文件内是有序,随着数据量的增加,多个文件的key的范围重叠的几率就会越来越大,...原创 2019-03-26 10:08:29 · 288 阅读 · 0 评论 -
leveldb数据库的version介绍
之前分享了leveldb的相关操作,其中compaction操作会导致磁盘存储文件的增加与删除,那在查询数据的时候是否会存在被查文件被删掉的可能呢?答案是不会的,本文就来看看leveldb自身的版本控制。我们从版本的结构,生成,使用,和销毁四个部分来说明。版本的结构:结构定义如下,我们在查询中重点关注的是 levels []tFiles属性。存储了当前版本所有的文件,以及session属性,s...原创 2019-03-26 19:20:44 · 735 阅读 · 0 评论 -
数据同步之快速同步基本流程(零)
区块链的数据随着挖矿的进行,数据量会越来越大,不论是BTC,ETH,还是HPB都存在这样的问题。那新节点的加入,为了保持账本的一致,就需要将网络中的数据同步到本地。本文就了解下HPB是如何同步数据的。在HPB的启动参数中有一个参数是–syncmode [full|fast|light] ,syncmode是同步模式,可以使用 全同步模式full,快速同步模式fast,轻量模式light,在不指定...原创 2019-03-26 19:23:14 · 2105 阅读 · 0 评论 -
数据同步之header同步源码解析(一)
根据前文对快速同步基本流程的解析。这里以新加入的节点为例,假设现在有1000个块需要同步,origin=0,pivot=900,from=origin+1,height=1000 ,通过代码分析下那快速同步是什么样子的。go-hpb/synctrl/synfast.go fetchHeaders函数是同步header的入口处,代码如下func (this *fastSync) fetchHea...原创 2019-03-26 19:27:17 · 806 阅读 · 0 评论 -
快速同步之header数据处理源码解析(二)
前文介绍了header是如何同步下来的,本文继续介绍同步下来的header是如何处理的。前文介绍header同步的时候有个fetchParts函数,当header数据同步下来后,会触发deliveryCh事件,执行deliver(packet)操作。deliver的定义如下deliver = func(packet dataPack) (int, error) {pack := packet...原创 2019-03-26 19:28:09 · 1008 阅读 · 0 评论 -
快速同步之body同步与数据处理源码解析(三)
前文header的处理触发了body的同步,即insertheaderchain成功后,触发了bodywakech事件,这里看看body的同步与处理是怎样的,入口函数是fetchBodies,注意函数内定义的几个函数func (this *fastSync) fetchBodies(from uint64) error {log.Debug(“fast syncing block bodies...原创 2019-03-26 19:29:31 · 395 阅读 · 0 评论 -
快速同步之块数据处理源码解析(四)
前文介绍了快速同步的header与body的同步流程,此时在resultCache中已经了完整的block数据。接下来看看要如何处理block,即是如何将block插入到链中。同时也可以了解下快速同步与全量同步的区别。func (this *fastSync) processFastSyncContent(latest *types.Header) error { stateSync ...原创 2019-03-26 19:30:51 · 390 阅读 · 0 评论 -
账号状态存储在MPT中的应用
关于MPT,这篇文章已经有很详细的介绍了:https://ethfans.org/posts/merkle-patricia-tree-in-detail。 所以本文不聊MPT的相关内容,只聊聊账号在MPT中是怎么存储的。World State,也就是世界状态,主要就是用来存储账户的状态的。可以根据块号查询某个账户的历史信息(余额,交易数),也可以通过最新块号查询很久都没有交易的账户信息都是通过...原创 2019-04-02 09:40:45 · 441 阅读 · 0 评论 -
将区块链节点的RPC访问协议由HTTP修改为HTTPS
目标目前DAPP应用对同步节点的访问都是通过http协议进行的,为了提高RPC接口访问的安全性,可以考虑将HTTP协议替换为HTTPS协议。本文的主要目的是介绍如何将RPC的访问协议由HTTP修改为HTTPS。准备工作本文测试用例以高性能区块链项目HPB为例。1、下载代码:代码路径 https://github.com/hpb-project/go-hpb ,2、安装openssl : ...原创 2019-06-13 16:18:58 · 1046 阅读 · 0 评论 -
减少新节点数据全同步花费时间的方法总结
背景对于任何一条区块链来说,随着运行时间的增长,数据量的增加是不可避免的一件事。那对于新加入的节点来说,需要同步的历史数据就会越来越多,同步数据花费的时间也会越来越长。这对于节点参与的积极性是有着不利的影响的。本文主要讨论能够减少新节点数据全同步花费时间的几种方法(目前主网全同步数据需要2天时间)。同步的耗时因素讨论具体方法之前,先考虑下同步数据时花费时间的具体耗时因素。数据量 : 数据总...原创 2019-06-13 16:22:31 · 783 阅读 · 2 评论 -
leveldb数据库的tablecompaction操作源码
前文介绍了memcompaction,主要是将内存数据写入磁盘。本文介绍tablecompaction,了解tablecompaction的过程,哪些表需要进行compaction,同时看看tablecompactiton有什么好处。直接上代码tableCompaction(leveldb/db_compaction.go),参数c,包含了要合并的表信息func (db *DB) tableCo...原创 2019-03-26 10:07:33 · 397 阅读 · 0 评论 -
leveldb数据库的缓存cache介绍
前文在介绍get操作的时候说过,get操作查询数据库,是需要先根据key定位到是哪个文件,然后去该文件中查询。那问题来了,如果每次都打开文件,查询磁盘,必然会导致有大量的磁盘IO,那查询的效率会大大降低。为了提升查询的效率,leveldb增加了缓存,用于缓存最近打开的文件数据。当定位到具体的文件时,先去缓存查看有没有该文件的缓存,有的话,直接在缓存中查找,没有的话才查询磁盘。下面看看代码实现。f...原创 2019-03-26 10:03:13 · 1125 阅读 · 0 评论 -
通过RPC执行智能合约查询返回0x问题总结
最近遇到一个问题,在区块链上执行智能合约的查询操作,返回结果为0x。问题环境:HPB区块链同步节点这里记录一下排查过程:1、复现。快速同步节点(无法复现)------>全同步节点(可以复现)最开始在快速同步节点上查询合约并没有出现问题,后来转到全同步节点上就会出现返回0x的情况。2、日志。打印合约执行日志。发现合约没有正常终止,而是中断。第一反应是合约执行出错导致的,因此在合约...原创 2019-01-10 15:43:54 · 1213 阅读 · 0 评论 -
不得不说的跨链技术
随着DAPP的发展,区块链的TPS是一个绕不过去的话题,以软硬件结合的HPB的TPS以达到5000+,就目前公链的TPS看,这已经是一个很高的值了。但有一点是必须要注意的,那就是这5000的tps是所有DAPP共有的,那就意味着随着DAPP的数量的增加,用户数量的增加,在高的TPS已有达到上限的一天,只是时间问题。考虑到目前公链的带宽,存储等问题,同时新节点接入的成本会越来越高,单条公链的发展瓶颈...原创 2019-01-02 10:57:03 · 354 阅读 · 0 评论 -
P2P网络的优缺点总结
我们知道区块链网络中多采用P2P网络来进行节点连接和节点之间的消息通信。这里对P2P网络的优缺点做个简单汇总。优点:1、网络中节点的可扩展性在P2P网络中,节点可以随意的添加和删除。新的节点添加到网络中,一般通过种子节点接入网络,同时种子节点将新节点广播给其他节点并进行连接。2、去中心化在P2P网络中,不存在客户端与服务器这样的严格区分,同时每个节点又充当着客户端和服务器。各个节点之间是...原创 2018-12-20 19:55:37 · 18648 阅读 · 0 评论 -
p2p网络中的节点发现之UDP
http://blockgeek.org/t/topic/1915server启动的时候,除了监听本地的tcp端口之外,还启动了udp端口的监听,而且udp端口的监听与udp通信在节点发现的时候起着关键作用。先看下为什么udp在节点发现中起着关键作用。在 https://blog.youkuaiyun.com/adwen2009/article/details/82878626 介绍了在节点启动后连接...原创 2018-12-04 16:12:52 · 1505 阅读 · 0 评论 -
以太坊之nonce
1、nonce是什么Number used once或Number once的缩写,在密码学中Nonce是一个只被使用一次的任意或非重复的随机数值,在加密技术中的初始向量和加密散列函数都发挥着重要作用,在各类验证协议的通信应用中确保验证信息不被重复使用以对抗重放攻击(Replay Attack)。在信息安全中,Nonce是一个在加密通信只能使用一次的数字。在认证协议中,它往往是一个随机或伪随机数...原创 2018-11-05 16:02:41 · 3040 阅读 · 0 评论 -
聊聊gas那些事
1、gas是什么。gas在词典中的解释是“气体,汽油,瓦斯”的意思,在以太坊中是驱动矿工参与的手续费的基础。在以太坊中跟gas有关的概念有gas,usedgas,gasprice,gaslimit,具体解释如下:gas:每笔交易设置的最大可用gas,相当于每笔交易的gaslimitusedgas:每笔交易实际花费的gas,并不是设置了多少gas,就使用多少gas,实际花费gas的计算参照g...原创 2018-11-02 16:48:43 · 773 阅读 · 4 评论 -
使用以太坊创建自己的私链,部署一个简单的智能合约,以及遇到问题备忘
将以下信息备忘,方便以后查询。1、 git clone https://github.com/ethereum/go-ethereum.git 下载速度很慢,直接下载源码包拷贝到环境中解压。 使用tar命令解压,提示错误,改用unzip解压 2、make geth 3、make all 4、cd build/bin 5、./geth version WARN [09...原创 2018-09-17 10:34:09 · 1099 阅读 · 0 评论 -
leveldb数据库的Get操作源码
前文介绍了Put操作的流程,基本原理就是将要写入的数据先追加到log文件中,然后写入内存,就算Put完成。leveldb是key-value类型的数据库,因此要进行某个value的查询,必须知道key才行,如此也就限制了leveldb无法进行条件查询,分区,分组,排序等操作。本文来看看仅有的Get操作是如何做的。先看Get函数入口func (db *DB) Get(key []byte, ro...原创 2019-03-25 19:37:43 · 807 阅读 · 6 评论 -
leveldb数据库的Put操作源码
之前的leveldb总结分享中说到了三个关键部分,数据的Put,Get,compaction。其中put操作实现了数据的增删改功能,Get操作实现了数据的查功能。本文从源码角度说明下put操作的相关流程。put接口位于leveldb的db_write.go文件中,代码如下func (db *DB) Put(key, value []byte, wo *opt.WriteOptions) err...原创 2019-03-25 19:38:14 · 588 阅读 · 0 评论 -
solidity基本编译原理介绍与添加新指令
本文目标 本文的主要目的 :1、了解solidity的基本编译原理 2、通过示例的方式了解如何添加新的指令,不会涉及到solidity语言的语法讲解。solidity简介 solidity是智能合约的开发语言,是一种语法类似于javascript的高级语言。合约源码经过编译生成虚拟机代码运行在虚拟机中。 开发文档:https://solidity.readthedocs.io/en...原创 2019-10-10 18:32:41 · 1521 阅读 · 5 评论