网络安全检测|网络安全服务|网络安全扫描-香港墨客投资移动版

主页 > 业界资讯 > ddos防御

解密区块链:从基础概念到技术实现的进阶攻略(5)

  用户建构并签署transaction,每个用户可以说明自己想要的gasPrice,可以是零。然而Frontier发布的以太坊客户端默认gasPrice是0.05e12 wei。由于矿工会使收入最优化,如果大部分transaction都以0.05e12 wei的gasPrice提交,就很难说服矿工接受价格更低或为0的transaction。

  示例transaction成本

  我们来做一个只添加2个数字的合约。EVM OPCODE ADD消费3gas。

  大概的成本,以默认gas价格计算 (2016年1月)是:

  3 * 0.05e12 = 1.5e11 wei

  这是个简化的计算,忽略了一些成本。

  EVM

  EVM:在底层,以太坊基于区块链技术,实现了数据的去中心化、分布式存储和信息交换的信任问题。同时,以太坊实现了一个叫Ethereum Virtual Machine(EVM)的运行时环境,类似JVM,它的主要工作是执行智能合约(该概念下面会介绍)的位元组码。

  接口:

  1. Java Console:以太坊客户端会启动一个相互的console,提供java运行环境,可以使用java API与节点交互。

  2. JSON-RPC server:节点可以启动json-rpc服务器,从而暴露JSON-RPC API

  3.命令行:geth

  结合以上概念,归纳Ethereum工作流程:

  以太坊的基础单元是账户,跟踪每个账户的状态,所有以太坊区块链上的状态转换都是账户之间价值和信息的转移。

  外有账户是由人类用户掌控,因为人类用户能够控制私钥,进而控制外有账户。而合约账户则是由内部代码管控。智能合约指的是合约账户中的代码:事务被发送给该账户时所运行的程序。用户可以通过在区块链中部署代码来创建新的合约。

  只有外有账户发出事务时,合约账户才会执行相应的操作,合约账户不可能自发地执行。因为以太坊要求节点能够与运算结果保持一致,这就要求保证严格确定执行。

  以太坊用户必须向网络支付少量事务费用。这可以使以太坊区块链免受无关紧要或恶意的运算任务干扰,比如分布式拒绝服务(DDoS)攻击或无限循环。事务的发送者必须在激活的合约账户的每一步付款,包括运算和数据存储。费用通过以太坊Gas结算,以太币的形式支付。

  事务费用由节点收集,矿工是以太坊网络中收集、传播、确认和执行事务的节点。矿工们将事务分组:以太坊区块链中账户状态的更新被分成的组存储在区块中(Block),矿工们会互相竞争,以使各自的区块(Block)可以添加到区块链的下一个节点上。矿工们每挖到一个成功的区块就会得到以太币奖励,这就为矿工带来了经济激励,促使矿工为以太坊网络贡献硬件和电力。

  矿工们通过解决复杂数学问题的任务以便成功地挖到区块(Block)。这被称为工作量证明(PoW)。一个运算问题,如果在算法上解决,比验证解决方法需要更多数量级的资源,那么它就是工作证明的最好选择。为防止比特币网络中已经发生的专用硬件(例如特定用途集成电路)造成的中心化现象,以太坊选择了难以存储的运算问题。这就使以太坊的工作量证明具有抗特定用途集成电路性,和比特币这种由专门硬件控制挖矿的区块链相比,能够带来更加去中心化的安全分布。

  三、以太坊开发

  搭建本地测试网络

  为了搭建本地测试网络,需要完成三件工作:

  构建geth客户端

  构建solidity编译器

  运行geth客户端

  以下就分别开始介绍。

  Ethereum客户端类似于Java虚拟机,按照黄皮书执行;项目早期,在不同的操作系统中就有多个可以彼此协作的客户端实现:go-ethereum、cpp-ethereum、pyethapp、ruby-ethereum等等。

  进入Homestead阶段后,Go客户端(geth)占据了主导地位,因此我们也采用go-ethereum完成测试网络的搭建。

  1. 首先在选择的目录下clone客户端代码go-ethereum

  2. 构建geth前需要安装额外库:

  mac系统:

  建议使用gvm管理go的版本:参见-

  ubuntu系统:

  参见-

  3. 最后,就可以使用以下命令编译geth了:

  编译成功生成build/bin/geth

  现在进入构建solidity编译器(源码安装)的流程:

  1. 首先在选择的目录下clone solidity的编译器代码

  2. 安装依赖

  3. 最后,就可以使用以下命令编译solc了

  geth和solc编译完成后,重新回到go-ethereum代码根目录

  1. 创建初始区块:

(责任编辑:admin)