当前位置: 首页 > news >正文

以太坊与比特币的异同

与比特币类似,以太坊是一个去中心化的区块链平台。在这个区块链平台上有众多节点参与,它们组成了一个P2P网络,这些节点彼此平等,没有任何一个节点有特殊的权限,也不存在由一个或多个节点进行协调或调度。以太坊网络中的各个节点都可以发出“交易”,也可以进行“记账”,即记录并执行网络上发出的“交易”。这些交易会被节点打包成一个个“区块”,其中每个区块包含上一个区块的索引,因此这些区块依次相连接,形成一条区块链。如上文所述,这些节点之间通过共识机制以达成数据一致性,从而形成一个整体。早期版本的以太坊像比特币一样使用“工作量证明”(Proof of Work,PoW)这种共识机制来保证一致性。

以太坊与比特币不同的地方有很多,从性能表现以及特性上来看,主要有以下几点区别。

  • 以太坊有更快的“出块”速度以及更先进的奖励机制。目前,比特币的出块时间平均为10min,而以太坊的出块间隔为12s,这意味着以太坊具有更大的系统吞吐量和更小的交易确认间隔。

  • 以太坊支持智能合约,用户可以自己定义数字资产和流通的逻辑,通过以太坊虚拟机几乎可以执行任何计算,而比特币只能支持比特币的转账。这一点意味着以太坊可以作为更通用的区块链平台,支持各种去中心化应用(DApp)。

另外,以太坊的社区更加活跃。显然,不像比特币一样满足于虚拟货币,以太坊积极地探索新技术,不断地对系统升级更新。而且其相关技术生态更加完善,在Ethereum官方的GitHub上有147个项目,其中不仅有各种不同语言版本的客户端,还有智能合约编译器、集成开发环境,以及未来将要采用的“股权证明”(Proof of Stake,PoS)协议和各种技术文档。

以太坊的特色技术

如上文所述,以太坊是一个可编程的区块链。形象一点地理解,在以太坊区块链上发送的交易不仅仅可以是转账金额,还可以是调用一段代码,而该代码可以由用户自定义。因此可以想象,在以太坊区块链上处理的交易逻辑不再是单一的转账,而可能是任意的函数调用;记录在区块链账本里的不仅仅是账户余额,还有函数调用后变量的新状态。因为代码可以任意定义,所以应用就都可以在区块链上运行了。

支持用户在以太坊网络中创建并调用一些复杂的逻辑,这是以太坊区别于比特币区块链技术最大的挑战。以太坊作为一个可编程区块链的核心是以太坊虚拟机(EVM)。每个以太坊节点都运行着EVM。EVM是一个图灵完备的虚拟机,这意味着通过它可以实现各种复杂的逻辑。用户在以太坊网络中发布或者调用的“智能合约”就是运行在EVM上的。智能合约和EVM将在第4章介绍。

所谓智能合约其实就是一段EVM可执行的代码,熟悉面向对象编程的读者可以将一个智能合约实例理解成一个对象。简单来说,用户编写一个智能合约类似于编写一个类,其可以在这个类里定义各种变量以及函数。当用户将这个智能合约发布到以太坊网络中时,相当于给这个类生成一个对象,合约发布之后用户会得到一个合约地址,相当于合约对象的指针。当网络中的用户调用这个智能合约时,可以直接给这个合约地址发送“交易”,并声明本次调用的函数名称和参数,使得智能合约执行对应的逻辑。无论发布还是调用智能合约,智能合约的信息都被附在“交易”中,以交易的形式发布到网络中。因此以太坊网络中的节点接收到这些交易后,其中的EVM会执行对应的合约代码,最后各个节点通过PoW或PoS等达成共识,合约的内容和状态也就实现了全网一致。

这里给出一个简单的例子。下面这段代码就是一个智能合约SimpleStorage,里面只有一个变量storedData,以及set和get方法,有编程基础的读者可以很轻松地理解。

contract SimpleStorage {

    string storedData;

    function set(string s) {

        storedData = s; 

    }

    function get() constant returns (string) {

        return storedData;

    }

}

图1-4展示了在以太坊网络中创建智能合约的过程。当Bob将一个包含智能合约信息(如上例代码)的交易发送到以太坊网络中后,节点的EVM执行这个交易并生成对应的合约实例,图中的“0x6f8ae93..”代表了这个合约的地址。节点间通过共识机制达成一致后,这个合约就正式生效了,之后用户就可以调用SimpleStorage合约了。

图1-5展示了在以太坊上调用智能合约的过程。Bob同样以交易的形式在“To”字段填上SimpleStorage合约的地址,在“Data”字段填上调用的方法(set)和参数(“Hello”),就可以调用智能合约SimpleStorage,将其中的storedData设为“Hello”。节点收到这条交易后,通过EVM执行对应的操作,并通过共识机制实现以太坊网络上合约状态的改变。之后,当Alice查看这个合约的变量时,就会发现这个合约中storedData变量的值变成了“Hello”。由于查看的过程不涉及状态的修改,而且以太坊上数据是分布式的,网络中的每个节点都可以在本地保存一份完整的数据,因此Alice可以不通过交易的形式查看到这个变量的值。

通过这个例子,可以理解如何在以太坊区块链上创建和运行一段代码以及代码变量的存储。在实际应用中,合作的几家机构可以用这段代码定义商业运作的规则,区块链作为执行规则的平台不为某个个体的意志所左右,公开公正地执行和记录代码的逻辑和数据,减少了机构合作中的摩擦和成本。

——本文摘自:《以太坊技术详解与实战》

推荐阅读

《以太坊技术详解与实战》

ISBN:978-7-111-59511-3

作 者:闫莺 郑凯 郭众鑫 编著

定 价:59.00元

出版时间:2018/04

内容简介:

以太坊创始人、首席科学家Vitalik Buterin倾力推荐,工业界与学术界区块链专家联合撰写,权威性和实用性毋庸置疑。

深入剖析以太坊架构、核心部件、智能合约编写与开发案例等关键技术,并涵盖以太坊数据分析、性能优化、隐私与数据安全等前沿实践与进展。

点击购买

相关文章:

  • 不止 Java,Oracle 向 JavaScript 开炮!
  • 犀牛书,Core java以及Python、机器学习等千本好书尽在当当书香节
  • Coder止步35岁?别闹,这份书单带你走上程序员进阶之路!
  • 天了噜,Java 8 要停止维护了!
  • 利用漏洞更改Google搜索排名
  • 这样的代码才是好代码
  • Python 人气王,JS 比 Java 更受企业青睐,PHP不再是最好的语言
  • 中国程序员VS美国程序员,差距在哪里?
  • 扎克伯格为提高员工工作效率,亲自做了这 26 张 PPT ,值得收藏
  • 解决智能合约安全问题的宙斯盾!
  • 区块链技术正在改变世界!
  • 跟着兜哥学“AI+”时代的网络安全
  • 机器学习、深度学习一站式搞定!
  • 5 月编程语言榜:C 再度暴涨,Python首次超越Java
  • AI计算力6年涨30万倍,多买几块GPU就能颠覆摩尔定律?
  • 【391天】每日项目总结系列128(2018.03.03)
  • CentOS 7 修改主机名
  • CSS 提示工具(Tooltip)
  • ES6语法详解(一)
  • flask接收请求并推入栈
  • HashMap剖析之内部结构
  • iOS 系统授权开发
  • js学习笔记
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • Python打包系统简单入门
  • 多线程事务回滚
  • 关于List、List?、ListObject的区别
  • 盘点那些不知名却常用的 Git 操作
  • 什么是Javascript函数节流?
  • 收藏好这篇,别再只说“数据劫持”了
  • 我与Jetbrains的这些年
  • 学习笔记TF060:图像语音结合,看图说话
  • 验证码识别技术——15分钟带你突破各种复杂不定长验证码
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (一)80c52学习之旅-起始篇
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • (转)人的集合论——移山之道
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • ... fatal error LINK1120:1个无法解析的外部命令 的解决办法
  • .NET delegate 委托 、 Event 事件
  • .net MVC中使用angularJs刷新页面数据列表
  • .net中的Queue和Stack
  • .NET中使用Redis (二)
  • .php文件都打不开,打不开php文件怎么办
  • 。Net下Windows服务程序开发疑惑