请选择 进入手机版 | 继续访问电脑版
高级搜索 关闭
本帖最后由 飞鸟 于 2018-11-4 19:14 编辑

1、以太坊的虚拟机
         首先我们了解下虚拟机是什么。虚拟机指的是:通过软件模拟的、具备完整硬件系统功能并运行在隔离环境下的完整计算机系统。比如虚拟物理机VMware、Java虚拟机等。而以太坊虚拟机(Ethereum Virtual Machine,EVM)是建立在以太坊区块链上的代码运行环境,其主要作用是处理以太坊系统内的智能合约。EVM是一个完全独立的沙盒,合约代码可对外完全隔离并在EVM内部运行,也就是说在EVM中运行代码是无法访问网络、文件系统和其他进程的,甚至智能合约之间的访问也是受限的。由于EVM分散储存在每个节点的计算机上,所以希望创建智能合约的公司可使用类似JavaScript和Python等编程语言创建运行于EVM的应用程序;同时以太坊虚拟机又能与主网的其余部分隔离,运行时不影响主区块链的操作。
            在以太坊的设计原理中描述了EVM的设计目标:
简单:操作码尽可能的少并且低级,数据类型尽可能少,虚拟机的结构尽可能少;
结果明确:在VM规范语句中,没有任何可能产生歧义的空间,结果应该是完全正确的。此外,计算步骤应该是精确的,以便可以测量gas的消耗量;
节约空间:EVM组件应尽可能紧凑;
预期应用应具备专业化能力:在VM上构建的应用能处理20字节的地址,以及32位的自定义加密值,拥有用于自定义加密的模数运算、读取区块和交易数据与状态交互等能力;
简单安全:为了让VM不被利用,应该能够容易地让建立一套gas消耗成本模型的操作;
优化友好:应该易于优化,以便即时编译(JIT)和VM的加速版本能够构建出来。
2、以太坊创世区块
初始区块是区块链的起始 — 第一个区块,区块0,唯一没有指向前面区块的一个区块。区块链里的第一个区块由中本聪创建于2009年,被称为创世区块。它是区块链里面所有区块的共同祖先,这意味着你从任一区块,循链向后回溯,最终都将到达创世区块。创世区块不是被挖出来的,它是被人为创建出来,并作为整条区块链的起点。
以太坊创始人维塔里克·布特林(Vitalik Buterin)在2013年9月,发布了以太坊白皮书(Ethereum White Paper)。为了筹措开发以太坊需要的资金,布特林发起了一次众筹。与一般的众筹不同,这次众筹只接受比特币支付,并会在以太坊正式发布后,使用以太坊中的通用货币以太币作为回报。众筹结果众筹地址共收到8,947个交易,来自8,892个不重复的地址,有两个地址是在众筹时间段之外支付的,所以这两个地址不能获得以太币。通过此次众筹,以太坊项目组筹得31,529.356,395,51BTC。在众筹成功一年后的2015年7月30日,以太坊正式发布。项目组兑现了承诺,创世区块中包含了8893个交易。通常创世区块都是预先生成好的,以太坊的创世区块就是使用这个脚本genesis_block_generator.py生成的。这个生成好的创世区块的Hash(0xd4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3)会被写进钱包软件中,从那一刻起,以太坊便正式宣告诞生。
下面是搭建一个私有链的需要创建的创世区块JSON文件的例子:
{  
   "alloc": {  
      "0x8277a6eab3ab2eb53e613c0935d93d25fe40bc47":{  
      "balance":"100000000000000000000000000"  
               }  
   },  
    "config":{  
        "chainId":100,  
        "homesteadBlock":0,  
        "eip155Block":0,  
        "eip158Block":0  
    },  
    "nonce":"0x0000000000000042",  
"mixhash":"0x0000000000000000000000000000000000000000000000000000000000000000",  
    "difficulty": "0x2000",  
    "coinbase":"0x544b1ccef4ff2494f5e1b7b3fecd4625eb3f86e1",  
    "timestamp": "0x00",  
"parentHash":"0x0000000000000000000000000000000000000000000000000000000000000000",  
    "extraData": "",  
    "gasLimit":"0xffffffff"  
}  
各参数字段的含义:
alloc: 用来预置账号以及账号的以太币数量,因为私链挖矿比较容易,所以我们也可以不预置有币的账号,需要的时候自己创建即可。
chainId:链的ID,以太坊公链是1,我们要与其不同,以免冲突
nonce: nonce就是一个64位随机数,用于挖矿。
mixhash:与nonce配合用于挖矿,由上一个区块的一部分生成的hash。
difficulty: 设置当前区块的难度,如果难度过大,cpu挖矿就很难。
coinbase: 矿工的账号,随便填
timestamp: 设置创世块的时间戳
parentHash: 上一个区块的hash值,因为是创世块,所以这个值是0
extraData: 附加信息,随便填,可以填个性信息
gasLimit: 该值设置对GAS的消耗总量限制,用来限制区块能包含的交易信息总和,因为写的是私有链例子,所以这里填最大。
3、智能合约
Nick Szabo对智能合约的定义是:一个智能合约是一套以数字形式定义的承诺(promises),包括合约参与方可以在上面执行这些承诺的协议。简单地说,智能合约就是传统合约的数字化版本,并且是一份自我强制执行的电子协议。它们是在区块链数据库上运行的计算机程序,可以在满足其源代码中写入的条件时自行执行。智能合约一旦编写好就可以被用户信赖,合约条款不能被改变,因此合约是不可更改的。
智能合约的优点:
①将合约以数字化的形式写入区块链中,因区块链的特性,数据将无法删除、修改,只能新增,整个过程透明可跟踪,保证了历史的可追溯性;
②因行为将被永久记录,可极大程度避免恶意行为对合约正常执行的干扰;
③多中心化,避免了中心化因素的影响,提高智能合约在成本效率方面的优势;
④当满足合约内容时,将自动启动智能合约的代码,既避免了手动过程,同时又保障了发行者无法违约;
⑤由区块链自带的共识算法构建出一套状态机系统,使得智能合约能够高效地运行。
4、geth客户端
Geth是go-ethereum项目的客户端,是以太坊的 go 语言命令行客户端,也是目前使用最广泛的客户端。支持windows、linux和OSX三类操作系统,git项目地址:https://github.com/ethereum/go-ethereum
Geth客户端主要功能:
  • JavaScript Console:通过后台进行命令操作;
  • Management API:管理相关的API;
  • JSON-RPC server:JSON-RPC相关调用API
  • 无论通过API或则console都可以进行相关操作,比如:
  • 账号管理(创建账号、锁定账号、解除锁定等);
  • 查询账户信息;
  • 查询交易信息;
  • 查询gasPrice;
  • 交易;
  • 挖矿&停止挖矿;
  • 部署智能合约
  • 等其他相关功能。
5、叔块的奖励机制和叔块引用的条件
在比特币协议中,最长的链被认为是绝对的正确。如果一个块不是最长链的一部分,那么它被称为是“孤块”。一个孤立的块是一个块,它也是合法的,但是发现的稍晚,或者是网络传输稍慢,而没有能成为最长的链的一部分。在比特币中,孤块没有意义,随后将被抛弃,发现这个孤块的矿工也拿不到采矿相关的奖励。而以太坊的GHOST协议,不认为孤块没有价值,而是会给与发现孤块的矿工以回报。在以太坊中,孤块被称为“叔块”(uncle block),它们可以为主链的安全作出贡献。
在以太坊中十几秒的出块间隔,大大增加了孤块的产生,并且降低了安全性。通过鼓励引用叔块,使引用主链获得更多的安全保证(因为孤块本身也是合法的) 。被引用的叔块,其矿工的报酬和叔块与区块之间的间隔层数有关系。叔区块的奖励有一个公式:叔区块奖励 = ( 叔区块高度 + 8 - 本区块的高度 ) * 固定区块奖励 / 8 ,如此得到下面一个表格:


叔区块的引用条件:
  • 叔块必须是区块的前2层~前7层的祖先的直接的子块
  • 一个区块最多包含2个叔区块
  • 被引用过的叔块不能重复引用
  • 引用叔块的区块,可以获得挖矿报酬的1/32,也就是5*1/32=0.15625 Ether。最多获得2*0.15625=0.3125 Ether

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
向来心是看客心,奈何人是剧中人
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版规则