以太坊学习笔记(二)—-以太坊工作原理
以太坊要在互联网世界中把原来对人的信任转变为对数学原理、对技术和对机器的信任,显然并不简单,但这是通过一整套清晰、严谨而又复杂的技术体系来实现的。
一、以太坊基本术语
| 区块(Block) | 由区块头与区块体构成,区块头包括区块描述信息、上一区块的散列值、时间戳等,区块体是该时间段的交易列表数据。 |
| 区块链( Blockchain ) | 区块之间通过区块头保存上一区块的散列值,使整个网络的区块数据构成了一个不易篡改的“链”式数据库。 |
| 账户( Account ) | 以太坊网络的基础工作单元,包括用户账户( EOA)和合约账户( COA ) 。用户账户由私钥控制; 合约账户由其合约代码控制并且仅能由用户账户触发。 |
| 交易( Transaction ) | 区块链数据记录的基本单元, 每一次转账行为、创建一个智能合约、调用一次智能合约均构成一个交易,交易需要消耗燃料。 |
| 工作量证明( POW ) | 以太坊主要采用的一种共识机制。通过挖矿节点计算数学问题,最先算出的节点获得新区块封装权( 即记账权) , 挖矿成功( 即成功封装区块)的节点将获得一定量的“虚拟币”, 获得新区块封装权的概率主要取决于挖矿节点在网络中的算力占比 |
| 权益证明( POS ) | 也是目前以太坊采用的主要共识机制之一。不由算力来决定记账权,而由节点账户在网络中预先分配的权益大小来决定新区块封装的概率。 |
| 智能合约( Smart Contract ) | 一段可以由以太坊虚拟机解释执行的代码, 创建时被存储于区块链上并获得一个合约账户(地址),执行时向该账户发送一个交易(即调用该合约,交易中包含有运行合约需要消耗的燃料及输入数据) , 由以太坊虚拟机调用合约代码执行。 |
| 以太币( Ether ) | 以太坊网络的基础“虚拟币” 。它是以太坊网络的重要应用之一,也是以太坊网络的一个基础设施, 可用于支持以太坊以智能合约为核心的各类应用的燃料消耗。 |
| 燃料( Gas ) | 以太坊提供了可执行图灵完备计算的智能合约, 为避免网络资源被随意浪费、恶意滥用或攻击,要求交易发出账户需要为此次交易中所使用的计算资源消耗燃料。(如不做特殊说明, 本书中的燃料,均指在区块链上执行操作时所消耗资源的名称) 。 |
二、以太坊工作机制
除了区块链1.0特征外。不同的是:
1、不再是支持单一的“虚拟币” 应用
以太坊的重点是通过对智能合约及虚拟机的实现来支持开放与灵活的各类区块链应用。
2、交易信息内容扩展
以大坊所记录的交易信息内容有了较大的扩展,不仅包括转账信息,还包括智能合约代码信息、输入及计算结果数据等 。
3、账户状态跟踪
以太坊网络中可跟踪每个账户的状态, 区块链上的状态改变就是账户之间相关数值和信息的传输。
4、智能合约
合约账户只能在用户账户发出命令后执行相应操作。它只能在用户账户的触发下操作这些功能, 合约的执行必须具有确定性, 即合约在创建和部署时, 技术人员就能确定合约执行的过程及可预期的结果。
以太坊通过交易有偿计算来解决以太坊网络可能面临用户无休止循环执行智能合约代码,从而造成网络计算资源巨大浪费并最终崩溃的危险。

Dapp结构图参考:

三、以太坊软件架构
软件架构图如下:

1、 以太坊的矿工(Miner)在一个分布式的网络(Network)中进行着挖矿操作,就是实现POW (或者POS)的一个共识算法过程。
2、 网络的同步(Sync) 是指各矿工共识过程同步,共识后产生的新区:块链( Blockchain ) 形成的最新账本也需要通过同步模块在各节点间实现数据同步。每产生一个新的区块( Block ),需要通过共识过程对区块验证(Blockvalidator),即需要散列计算验证、签名、定序等。因此,区块链、共识机制、矿工、网络是以太坊产生和维护区块链的核心部件。
3、 以太坊平台上的各种去中心化应用,需要编写并部署智能合约代码。智能合约代码通过以大坊虚拟机调用和解释执行,处理区块链与共识的相关事务, 同时基于RPC协议(一种用于规范网络从远程计算机程序上请求服务的协议)进行挖矿和网络层事务的交互,从而实现各种交易如转账等具体应用。
四、以太坊客户端
1、以太坊客户端
在以太坊项目的初期,不同操作系统上有多个客户端项目,这些客服端采用了不同的编程语言并具有不同的接口特点,但基于同样的协议, 可以在同一个网络中交互和共生。
目前以太坊支持的客户端有go-ethereum 、Parity 、pyethapp和cpp-ethereum等。处于领先地位并被广泛应用的客户端是go- ethereum 和Parity ,这两个分别由以大坊基金会( Ethereum Foundation )和Ethcore支持,代表了以太坊非常高的水平,其中go -ethereum客户端应用非常广,Parity 也因为一些显著的特征,如运行速度快、支持POS共识机制等, 受到用户广泛的欢迎。
2、以太坊虚拟机
以太坊虚拟机是以太坊客户端的重要组成部分。以太坊本身其实是一个可编程的区块链,具体是通过在客户端嵌入支持智能合约代码解释执行的以大坊虚拟机来实现的。
以太坊允许用户根据自身的需求与意愿自行创建各种复杂度的操作功能。基于这个能力,以太坊在很多不同类型的去中心化区块链应用(包括但不限于加密“虚拟币”)中转变为一个平台。基于该平台, 用户可以灵活创建各类基于公共账本的去中心化应用。
以太坊数据库的维护和更新由连入网络的很多节点共同完成。网络中的每个节点都运行以太坊虚拟机和执行相同的命令。这也是以太坊被称为“全球计算机”的主要原因。
五、以太坊网络
以太坊网络是由很多运行以太坊客户端的节点构成的P2P 网络,这些节点将维护和保证区块链数据安全,维护网络的稳定,执行以大坊分布式共识机制,向以太坊用户提供可持续服务。
基于以太坊客户端可以搭建3种不同类型的以太坊网络,这3种不同网络的主要区别如下。
1、公有链
公有链是一种世界上任何人均可以查看、发送交易并记录符合规则的交易,均可以参与共识过程(共识过程决定哪个区块,加入链,由此决定当前区块链的状态)的一种区块链。
2、联盟链
联盟链是一种由预先选定节点决定共识过程的区块链。联盟链是一种半中心化的网络, 需要在联盟成员之间达成共识,具有中心化平台和区块链的一些综合特点。
查看区块链的权利可以是公共的或者仅限于参与机构,同时也有混合权限情况,如区块的根散列是公共的,而其余部分则需要通过联盟机构所设置的API授权查询。
比如,一个由20个银行机构所构成的联盟,每个机构运行一个节点,每个有效区块要求至少其中12个节点签。
3、私有链
私有链的块链写入权由中心化节点或一个组织所控制,块链查询权是公共的或受到不同程度的限制。
采用封闭的私有链来提供服务与传统的中心化平台提供服务,对用户而言并无任何本质的不同,在技术上也没有特别明显的优势。
六、账户与智能合约
账户(地址)在以太坊网络中扮演着非常核心的作用, 其数学基础是非对称加解密机制形成的一对公私钥,用公钥来生成用户的账户(地址),用私钥来对用户所发出的数据进行签名并接收发送给其账户的数据。 智能合约是以大坊在区块链上的重要创新,其实质是以账户为基础, 存储在账户存储空间中的可由以太坊虚拟机解释执行的一段代码。
1、以太坊账户
用户账户和合约账户, 通常说的账户所指的是用户账户,用户账户由用户自主创建,并通过持有私钥而掌握账户的所有权,合约账户归属于创建自身的用户账户。
以太坊把用户账户与智能合约均称为账户是因为二者均为状态对象,用户账户记录用户账户余额,智能合约记录账户余额、合约代码与数据内容。
所有账户的状态就是以太坊网络的状态,这些状态由全网已达成共识的新区块来保持不断更新。
账户代表外部代理(如自然人、挖矿节点、自动代理)的身份,它使用私钥加密去鉴证每个交易,这样以太坊虚拟机就能安全地通过公钥识别每个交易发送者的身份(账户或地址) 。
2、密钥文件
每个账户有一对密钥,一个为私钥,一个为公钥。账户由其地址索引,地址取自其公钥的最后20字节。由私钥和地址形成的密钥对均被编码和存放在一个密钥文件中,密钥文件采用JSON文本文件格式,人们可通过文本编辑器打开和浏览。
密钥文件的关键部分-一私钥通过在创建账户时输入密码来加密保护。密钥文件Keyfiles可在以太坊节点数据目录中的子目录Key store中找到。
一个新建立的以太坊账户中是没有任何“虚拟币”的,这需要用户通过挖矿获得。
用户要确保经常备份Keyfiles 以保证账户安全,丢失密钥文件或丢失密码即意味着丢失账户及账户上的“虚拟币”,任何人都无法帮用户找回。
3、智能合约
智能合约是存储在以太坊网络特定地址的一组代码(函数)和数据集。合约账户能够相互发送消息并具有图灵完备计算能力。
合约在区块链上用以太坊特定的二进制格式即以太坊虚拟机字节码的形式存在,由以太坊虚拟机解释执行。
智能合约一般采用如Solidity这样的高级语言来编写,然后编译成字节码加载到区块链上。智能合约也可以用其他语言编写,比较有名的有Serpent和LLL 。
( 1 ) Solidity
Solidity是一种用于开发智能合约并编译成以太坊虚拟机字节码的类JavaScript语言,是以太坊非常著名的旗舰语言。
( 2) Serpent Serpent是一种用于编写智能合约并编译成以太坊虚拟机字节码的类Python语言,其目标是提供一种简洁、可兼具低级语言的高效率与高级语言的易于使用两者特性的语言,同时它还为合约编程增加了一些特定领域的特殊功能。
( 3) LLL 类Lisp语言( Lisp Like Language, LLL )是一种与汇编语言类似的低级语言,这意味着它非常简洁,基本上就是直接在以大坊虚拟机字节码基础上进行简单包装而形成的一种语言。
七、燃料和以太币
1、要在以太坊公有网络中部署智能合约应用,发布者需要拥有以太币。以太币的获取途径有多种,比如成为一名以太坊矿工,使用以太坊钱包Mist ( Beta 6 以上版本) 等软件获取以大币的相关接口等。
2、以太币的重要功能是用于换取燃料,燃料是使用以大坊网络资源的重要条件。
3、以太坊的运行规则就是交易发送者在以太坊中使用计算资源时会消耗一定量的燃料, 这意味着交易发送者在使用以太坊的计算资源时需要花费一定的燃料成本。
4、在以太坊网络中,燃料,总成本的计算方法为: 燃料需求量乘以当前的燃料价格。为更好地理解燃料,下面重点介绍与之相关的4个术语。
( 1 )燃料花费。燃料花费指一次计算需要多少燃料的一个静态值。燃料花费是基于交易的复杂度和计算量的大小而设定的。由于每个计算步骤所需燃料一般不会变化,因此其燃料花费将长期保持稳定。 ( 2 )燃料价格。燃料价格指单个燃料所需以太币的“虚拟价格”由用户和矿工的设定值基于“市场”的平衡决定,即通过用户设置所希望的价格和以太坊网络中最终接受的处理节点数量来保持与以太币“虚拟价格”之间的平衡。 ( 3 )燃料限额。燃料限额指每个交易允许使用的最大燃料数量值,它用于计算最大计算负载、交易数量或者区块大小,矿工可逐步改变这个值。 ( 4 )燃料费用。燃料费用是运行特定交易或程序(合约代码)所消耗的有效燃料以以太币计算的总费用。一个区块的燃料费用可用于表示计算负载、交易量或者区块大小。燃料费将奖励给成功封装该区块的矿工(使用POW共识机制)或区块验证者(使用POS共识机制) 。
因此, 燃料是以太坊网络稳定运行的重要设施, 其价值在于确保网络的安全性。
(本节完)
上一节 :以太坊学习笔记(一)—基本概念与体系结构
更多推荐



所有评论(0)