自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(41)
  • 收藏
  • 关注

原创 以太坊源码解读(23)stateDB分析

前面介绍了以太坊MPT树的结构和方法,而stateDB对象就是对以太坊状态MPT进行管理的对象。其管理功能包括:1、初始化:New2、增加:StateDB.createObject3、删除:StateDB.Suicide4、修改:StateDB.AddBalance5、查询:StateDB.GetBalance6、拍摄快照:StateDB.Snopshot7、恢复快照:StateDB...

2018-12-20 00:03:33 3808 1

原创 以太坊源码解读(22)merkle-Patricia Tries(MPT)默克前缀树原理

MPT是以太坊中一种使用很广泛的数据结构,用来管理以太坊账户的状态、状态的变更、交易和收据等。在以太坊中MPT有以下几个应用的场景:1、交易树:记录交易的状态和变化。缓存到MTP2、收据树(交易收据):交易收据的存储3、状态树(账户信息):帐户中各种状态的保存。如余额等。4、账户中的Storage树。这是数据都持有一个接口,即trie  Trie:type Trie stru...

2018-12-16 00:51:02 2335 4

原创 以太坊源码解读(21)EVM解释器代码分析

之前我们说到EVM解释器是面对Contract对象的,不论是Contract的创建还是调用,都会通过run()函数来调用Interpreter的Run()方法。该方法初始化执行过程中所需要的一些变量,然后进入堆栈操作的主循环。一、Interpreter.Run()a. 初始化执行循环中的中间变量if in.intPool == nil { in.intPool = poolO...

2018-12-10 23:57:09 1485

原创 以太坊源码解读(20)通过EVM执行转账或合约调用——Call()

在了解合约调用之前,我们需要知道调用合约的本质是什么。在我们创建合约的时候,由run函数初始化的智能合约code(ret)储存在stateDB中。也就是说在内存中并没有Contract这个对象,而只是存在智能合约code。那我们如何调用合约呢?本质上,调用合约实际上是从合约账户中取出合约代码,然后NewContract()创建出一个临时的contract对象(如下图),然后执行contract的S...

2018-12-09 23:38:18 2642

原创 以太坊源码解读(19)通过EVM创建智能合约——Create()

我们要知道,evm解释器的执行上下文是stateTransition,是交易,但evm的服务对象是智能合约。智能合约与evm的解释器有紧密的联系,所以我们这一节先从智能合约的创建和执行开始学习。合约创建函数的调用时机,一是Worker执行交易的过程,交易如果是合约创建,则会在EVM执行交易时生成智能合约地址并部署智能合约;二是通过opCreate指令,这个指令使得在智能合约内部创建新的智能...

2018-12-09 15:32:15 3568

原创 以太坊源码解读(16)miner模块和Worker模块概述(最新源码)

 最新的以太坊源码Miner模块有较大的改动,取消了原来的agent模块以及work对象,但是基本上的逻辑还是一样的。Miner模块的主要执行部分在worker中,Miner对象及其方法主要控制着模块的开关和外部接口。一、Miner模块type Miner struct { mux *event.TypeMux worker *worker coinbase comm...

2018-12-06 17:17:33 3136

原创 以太坊源码解读(15)交易池(二)交易池的升级、降级和重置

1、交易池降级:TxPool.demoteUnexecutables主要功能是从pending中移除无效的交易,同时将后续的交易都移动到queue。1)丢弃nonce值过低的交易:list.Foward(nonce)2)删除账户余额已经不足以支付交易的交易:list.Filter(pool.currentState.GetBalance(addr), pool.currentMaxGas)...

2018-12-05 23:13:55 1642

原创 以太坊源码解读(13)广播和同步(四)Downloader解析

protocolManager启动了四个go程,其中包含用于定期同步的协程:syncer,该协程调用protocolManager的synchronise方法调用,选择td最高的节点进行同步:go pm.synchronise(pm.peers.BestPeer())synchronise获取了节点的头区块和难度值td,确定了同步模式(fastSync或fullSync),最终调用dow...

2018-12-05 10:54:43 962

原创 以太坊源码解读(12)广播和同步(三)Fetcher解析

Fetcher是基于广播的同步工具,所以Fetcher必然是通过protocolManager的handleMsg()来调用的。下面就是handleMsg中收到NewBlockHashesMsg和NewBlockMsg时,均会调用fetcher的方法来进行相应的处理 case msg.Code == NewBlockHashesMsg: var announces newBlockHas...

2018-12-03 14:17:13 1557

原创 以太坊源码解读(11)广播和同步(二)同步模块和模式基本概念

以太坊网络中不断重复着广播和同步,这样才能保证对以太坊全网的规范链的维护和统一。一、广播【广播】主要是广播区块、区块hash和交易,分别通过ProtocolManager.BroadcastBlock和ProtocolManager.BroadcastTxs两个方法执行。广播有下面几种情形:1、minedBroadcastLoop()监听到新区块事件后,把新区块和区块hash分别广播出去...

2018-12-03 14:16:34 2480

原创 以太坊源码解读(10)广播和同步(一)protocolManager及其handle()方法

前面提到了ProtocolManager,从字面上看是协议管理器,负责着p2p通信协议的管理。它连接了p2p的逻辑层peer与顶层peer之间的调用,从顶层将协议传递至逻辑层,再从逻辑层得到message传递到顶层。1、fastSync规定了同步的模式 ,通过atmoic.LoadUint32(&pm.fastSync)  == 1或0来打开或关闭fastSync模式;2、acc...

2018-11-29 15:48:42 2417

原创 以太坊源码解读(9)以太坊的P2P模块解析——底层网络构建和启动

以太坊的底层p2pServer,大约可以分为三层:1、底层:table对象、node对象,它们分别定义了底层的路由表以及本地节点的数据结构、搜索和验证;    1)database.go         //封装node数据库相关操作    2)node.go             //节点数据结构    3)ntp.go              //同步时间     4)t...

2018-11-21 13:32:36 3499

原创 以太坊源码解读(8)以太坊的P2P模块解析——节点发现和K-桶维护

回顾一下,前面说到以太坊分布式网络采用了Kademlia协议,它的特点是:1、采用了二叉树的拓扑结构;2、每个节点都对整树进行拆分,分成n棵子树;3、从每棵树中取K个节点,构成“k-桶”,每个节点控制着n个k-桶;4、节点的距离是通过异或的二进制运算得到的;5、k桶中的节点不是固定不变的,而是不断刷新变化的。下面,我们来看看Kademlia协议在以太坊中的具体实现。一、以太坊的k...

2018-11-17 01:38:19 3177

原创 以太坊源码解读(7)以太坊的P2P网络基础

一、分布式网络的来历基于P2P技术的应用有很多,包括文件分享,即时通信,协同处理,流媒体通信等等。其中文件分享和下载是p2p技术最集中体现。其中,DHT技术是目前很多分布式系统所普遍采用的方案,也包括以太坊。所以这里先要对DHT技术有所了解。二、DHT(Distributed Hash Table)技术简介DHT全称叫分布式哈希表(Distributed Hash Table),是...

2018-11-11 21:14:02 1195 2

原创 以太坊源码解读(6)blockchain区块插入和校验分析

以太坊blockchain的管理事务:1、blockchain模块初始化2、blockchain模块插入校验分析3、blockchain模块区块链分叉处理4、blockchian模块规范链更新上一节分析了blockchain的初始化,这一节来分析blockchain区块的插入和校验分析以及规范链更新。一、InsertChain函数主要功能:调用insertChain将一组区块...

2018-11-04 00:58:24 4531 4

原创 以太坊源码解读(5)BlockChain类的解析及NewBlockChain()分析

一、blockchain的数据结构type BlockChain struct { chainConfig *params.ChainConfig // 初始化配置 cacheConfig *CacheConfig // 缓存配置 db ethdb.Database // 底层的数据储存 triegc *prque.Prque gcproc time....

2018-11-01 16:30:43 2296

原创 以太坊源码解读(4)Block类及其储存

一、Block类type Block struct { /******header*******/ header *Header /******header*******/ /******body*********/ uncles []*Header transactions Transactions ...

2018-10-31 23:49:05 1234 1

原创 以太坊源码解读(3)以太坊启动流程简析

启动命令:geth --identity "TestNode1" --datadir "data0" --rpc --rpcapi "db,eth,net,web3" --port "30303" --networkid "29382" --ws --wsorigins="*" --rpccorsdomain="*" console启动后,我们可以从日志来分

2018-10-30 10:47:55 3155 1

原创 以太坊源码解读(2)以太坊客户端geth源码目录解析

Geth是以太坊官方唯一推荐的客户端,相当于是对以太坊区块链的官方实现。源码的地址是:https://github.com/ethereum/go-ethereum下面我们来从Geth源码的目录来看看以太坊都有哪些模块。一、目录分析go-etherreum-master |- accounts /* 实现了高层级Ethereum账号管理 */ | |- abi ...

2018-10-28 15:22:01 2891

转载 以太坊源码解读(1)以太坊核心概念

一、定义以太坊是一个开源的带有智能合约功能的公共区块链平台。特点:1、支持智能合约,以太坊不是给用户一系列预先设定好的操作,而是充分允许用户按照自己的意愿创建复杂的逻辑操作;2、以太坊同时还构建了较完整的、开源的生态系统:有底层的geth、编程的solidity、合约在线浏览器browser-solidity、合约钱包Mist/wallet、前端开发框架Treffle,以及在此基础上运...

2018-10-28 15:21:10 1933

原创 ERC721标准简析

ERC20是可替代型通证,ERC721则是不可替代型通证。这意味着每个通证是完全不同的, 并且每个通证对不同的用户都有不同的价值。 这种类型通证最具有代表性的应用就是CryptoKittes,每一个数字猫都是独立的,因为每只猫各有千秋,而且由于不同辈分的稀缺性不同,市场价格也差异巨大。。如果说ERC20实现了“币”,那么ERC721就实现了“货”。如果说ERC20协议本身只能发行可替代性通证(...

2018-10-21 22:27:34 3658 2

原创 ERC20标准的简述

ERC是Ethereum Request for Comments的缩写,代表以太坊开发者提交的协议提案。ERC20可能是其中最广为人知的标准,协议规定了具有可替代性Token的一组基本接口,包括代币符号、发行量、转账、授权等。所谓可替代性Token指代币之间无差异,同等数量的两笔代币价值相等。所以类似交易所里的那些代币都是可互换的,使用相同的标准就使得代币之间可以兑换,也以为着这些代币可以用...

2018-10-21 19:42:50 3559

原创 NodeJS区块链实践(2)与区块链交互,基于区块链的web服务

前面我们搭建了一个简单的私链,这一节我们看看如何与区块链进行交互。我们这里使用Express来搭建我们的服务端应用。Express Express是一个简洁而灵活的 node.js Web应用框架, 提供了一系列强大特性帮助你创建各种 Web 应用,和丰富的 HTTP 工具。使用 Express 可以快速地搭建一个完整功能的网站。const bodyParser = requ...

2018-10-20 23:31:58 2303

原创 NodeJS区块链实践(1)Nodejs搭建简易区块链

区块链的目的之一是让我们所需要的“有价值”的信息得以保存且不可更改,这些信息都储存在一个叫做“区块(block)”的结构中。以比特币为例,被认为是有价值的信息是“交易”,所有的交易储存在区块中,通过区块的hash、时间戳等实现信息的可追溯以及不可更改性。我们这里首先实现的是一个简易的区块链,并不是像比特币这样成熟的区块链,暂不涉及交易结构、验证以及UTXO。一、区块(block)首先,...

2018-10-20 15:55:24 5374

翻译 以太坊开发基础(6)以太坊客户端geth命令详解

Geth在以太坊智能合约开发中最常用的工具(必备开发工具),一个多用途的命令行工具。熟悉Geth可以让我们有更好的效率,大家可收藏起来作为Geth命令用法手册。 本文主要是对geth help的翻译,基于最新的geth 1.7.3-stable版本。命令用法geth [选项] 命令 [命令选项] [参数…]// 例如geth --identity "TestNode1" --d...

2018-10-19 14:02:52 294

原创 以太坊开发基础(5)geth控制台console方法清单(二)—— web3.js方法

web3.js有0.2版本和1.0版本的区别,本文列出的是web3.js 1.0版本提供的api。首先,需要注意web3.js的如下几个注意事项:1、使用callbacksweb3.js的API使用的是异步http请求,如果需要同步,则需要使用回调函数:web3.eth.getBlock(48, function(error, result){ if(!error) ...

2018-10-19 11:37:29 2343

原创 以太坊开发基础(4)geth控制台console方法清单(一)

此清单只为俯瞰一下geth中可以使用哪些方法来与以太坊进行交互,详细的还是要参考官方文档:可以参考:https://github.com/ethereum/go-ethereum/wiki/Management-APIshttps://ethereum.gitbooks.io/frontier-guide/content/jsre.htmlethereum JavaScript C...

2018-10-19 11:18:46 3585

转载 以太坊开发基础(2)搭建私链以及geth命令

一、创建以太坊初始区块文件 genesis.json{ "config": { "chainId": 101, "homesteadBlock": 0, "eip155Block": 0, "eip158Block": 0 }, "alloc": {}, "coinbase": "0x00000000000

2018-10-19 09:24:20 984

原创 以太坊开发基础(1) —— 以太坊开发环境的搭建

一、以太坊开发环境首先,以太坊上开发区块链应用需要哪些工具?我们首先要在系统中搭建怎样的开发环境?以太坊相较于比特币,有着更加完整的生态系统:geth:最常用的以太坊客户端,用go语言编写,是以太坊协议的具体实现。功能强大,能够实现账户管理、合约部署和执行、搭建私链、开启挖矿等。 Mist / ethereum wallet:图形化的以太坊钱包客户端,仅用于实现以太坊账户管理相关的功...

2018-10-15 14:47:41 1161

原创 solidity学习笔记(11)—— 错误处理和前置判断:require()、assert()和revert()

合约中有一些功能,只能被授权为 拥有者 的地址才能调用。传统的处理方式如下:Solidity 0.4.10之前(以及其后一段时间),这种强制授权处理方式很普遍:contract HasAnOwner { address owner; function useSuperPowers(){ if (msg.sender != owner) { throw;...

2018-10-15 14:08:21 1692 3

转载 solidity学习笔记(12)—— 单位和全局可变量

单位和全局可变量Ether单元一个字面上的数字可以带有wei,finney,szabo或者以太网的后缀,可以在以太网的子目录之间进行转换,其中没有后缀的以太网货币号被假定为魏。 2 ether == 2000 finney评估为true。时间单位可以使用文字数字后的秒,分,小时,天,周和年份进行后缀转换,其中以秒为单位,以下列方式将单位视为天真的时间单位:1 == 1 seconds...

2018-10-13 14:02:49 239

转载 solidity学习笔记(10)—— 事件、日志与交互(含实例)

事件是以太坊EVM提供的一种日志基础设施。事件可以用来做操作记录,存储为日志。也可以用来实现一些交互功能,比如通知UI,返回函数调用结果等。总的来说:事件就是当区块链某个函数被调用或执行的时候,被触发从而被前端获取或者记录到日志中的对象。一、事件的实现事件的实现是在合约对象中,分两步:1、定义事件类型2、实例化事件对象代码:pragma solidity ^0.4.19;...

2018-10-13 13:56:38 2113

原创 solidity学习笔记(9)—— 接口和抽象合约

一个合约如何读取其他合约的数据或调用其他合约的方法?接口的存在就是为了合约之间的通信。有两种实现方式:抽象合约 和 接口一、抽象合约抽象函数是没有函数体的的函数。如下:pragma solidity ^0.4.0;​contract Feline { function utterance() returns (bytes32);}这样的合约不能通过编译,即使...

2018-10-13 13:14:06 4184 3

原创 solidity学习笔记(8)—— 函数修饰符及自定义修饰符

在Solidity中,函数修饰符规定了函数的行为、调用规则。在Solidity语言中预置的修饰符有如下一些:1、函数和状态变量可见性修饰符public:在外部和内部均可见(创建存储/状态变量的访问者函数)private:仅在当前合约中可见external: 只有外部可见(仅对函数)- 仅仅在消息调用中(通过this.fun)internal: 只有内部可见2、状态变量储存位置修饰符...

2018-10-13 13:09:19 2026

转载 solidity学习笔记(7)—— 元组:解构赋值和返回多个结果

Solidity内置支持元组(tuple),也就是说支持一个可能的完全不同类型组成的一个列表,数量上是固定的(Tuple一般指两个,还有个Triple一般指三个)。这种内置结构可以同时返回多个结果,也可用于同时赋值给多个变量。一、什么是元组?contract C { mapping(uint => string) public students; function ...

2018-10-13 13:05:53 3297

原创 solidity学习笔记(6)—— 数据类型详解和转换

目录:1、整型(int)2、地址类型(address)3、枚举类型(enum)4、结构体(struct)5、映射(mapping)6、数组(array)7、字符串和字节数组(string、bytes)Solidity有如下类型的数据:值类型:布尔类型(bool)、整型(int)、地址类型(address)、定长字节数组(bytes)、枚举类型(enum)、函数类型(func...

2018-10-13 13:03:35 6482

原创 solidity学习笔记(5)—— Storage(引用传递)和Memory(值传递)

Solidity中有两种类型:值类型和引用类型Solidity是静态类型的语言,有值类型和引用类型的区别。如果一个变量是值类型,那么当把它的值传给另一个变量时,是复制值,对新变量的操作不会影响原来的变量;如果该变量是引用类型,那么当它传值给另一个变量时,则是把该值的地址复制给新的变量。这样操作新变量也会导致旧变量的改变。值类型:布尔类型(bool)、整型(int)、地址类型(addre...

2018-10-13 12:57:08 2072

转载 solidity学习笔记(4)—— 调用外部函数以及关键字payable

在智能合约中,函数和状态变量的可见性可以分为四种, public , private , internal 和 external ,函数默认可见性是 public ,状态变量的默认可见性是 internal 。public - (任意访问,作为合约接口)可以通过内部调用或通过消息调用。对公共状态变量而言,会有的自动访问限制符的函数生成。private - (仅当前合约内)私有函数和状态变量仅仅在定...

2018-10-13 12:54:34 5135 1

原创 solidity学习笔记(3)——Solidity-合约属性和访问权限的继承

!!!重要!!!子合约只能继承父合约中的所有的public类型的函数,不能继承internal/private的函数pragma solidity ^0.4.4;contract Animal { string _birthDay; // 生日 int public _age; // 年龄 int internal _weight; // 身高 string...

2018-10-13 12:49:31 785

原创 solidity学习笔记(2)——状态变量和函数可见性

因为Solidity有两种函数调用:内部调用:不创建一个真实的EVM调用(也称为“消息调用”);外部的调用:要创建一个真实的EMV调用,在智能合约中,函数和状态变量的可见性可以分为四种, public , private , internal 和 external ,函数默认可见性是 public ,状态变量的默认可见性是 internal 。public - (任意访问,作为合约接口)可以通...

2018-10-13 12:46:05 1576

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除