以太坊:比特币+一切可能

作者:Mike Goldin

译者:java达人

来源:https://medium.com/@ConsenSys/ethereum-bitcoin-plus-everything-a506dc780106

在开始之前,请阅读以太坊白皮书中有关帐户,交易和消息的三个部分。 如果你愿意,也可以阅读其余的内容,但是如果你阅读了通过比特币了解以太坊(1),那么你已经了解了基本的技术基础。 就像您阅读比特币白皮书时一样,如果在第一次阅读时没有理解,也没有关系。 我们慢慢会理解的。

现在思考合约!

智能合约是在区块链中存储和执行的代码。 添加用户界面并将智能合约用作去中心化应用程序(或dapp)的后端。 借助对比特币区块链的理解,可以将比特币交易视为一个带有三个输入和两个输出的简单程序(这是对比特币实际的输入和输出原始概念的混淆,但现在不必纠结)。输入是要传输的一笔比特币,传输的源地址以及传输的目的地址。 输出是以前指定的账户,每个账户都有一个表示转账的新余额。 挖掘的交易是一条公共记录,这个简单的程序是按照给定的输入执行的,并产生一组输出。 在比特币中,转账程序是唯一存在的程序,在给定输入时,因此每个节点都知道如何验证输出是否有意义。

以太坊扩展了这些程序的范围,从简单的金额转移扩展到任何可以在图灵机上编程的东西。 如果你在计算机课睡觉的话,这意思就是以前的编程内容都可以在以太坊上进行。

以太坊通过在网络的每个节点中内置一台虚拟机(称为以太坊虚拟机,或EVM)来实现这一复杂特性。 EVM在概念上和其他任何虚拟机没什么不同。 例如,您可能已经熟悉Java虚拟机(JVM)。 就像JVM代码将运行在托管JVM的任何计算机上,并通过同一组输入产生相同的输出一样,EVM让Ethereum区块链代码能够根据一组输入产生一致的合理的输出。

比特币区块链上的完整节点将存储从零区块开始达成的每一笔交易; 以太坊区块链上的完整节点还存储与给定帐户关联的静态代码(如果有)以及存储中的代码的当前状态。

设想一个简单的程序存储在账户上,以1个数字作为输入,将这个数字加到一个运行中的总额上,并用新的总额覆盖前一笔总额。 两个帐户已将交易发送到此合同帐户,第一个输入5,第二个输入2。 存放在以太坊区块链上的是:

  • 该帐户及其静态代码。
  • 帐户当前的存储状态,其金额设置为7。
  • 历史帐户存储状态,其金额设置为5。
  • 历史帐户存储状态,其金额设置为0。
  • 三笔交易记录:一笔交易记录来自代码最初存储时的记录,一笔记录来自输入5的账户,一笔来自输入2的账户。

想象一下类似的程序存储在一个单独的账户(必须的)中,它执行相同的任务,但同时存储一个两字段结构的线性数组(结构是结构化排列数据的模板),每个都包含一个表示交易发起者的地址和发起人提供的输入。 两个帐户已将交易发送到此合同帐户,第一个输入5,第二个输入2。 存放在以太坊区块链上的是:

  • 该帐户及其静态代码。
  • 帐户当前的存储状态,其金额设置为7,包含两个结构的数组。
  • 历史帐户存储状态,其金额设置为5,数组包含一个结构。
  • 历史帐户存储状态,其金额设置为零并且为空数组。
  • 三笔交易记录:一笔交易记录来自代码最初存储时的记录,一笔记录来自输入5的账户,一笔来自输入2的账户。

现在我们可以轻松地重构此帐户的过去状态,并通过查看哪些帐户与其交互来创建这些状态。 但是,这种模式应该避免。 为什么? 在上面给出的例子中,存储在数组中的所有数据都可以通过区块链本身进行重构。 在这一点上,狡猾一点人已经想象到破坏以太坊区块链的几种方式; 接下来我们将了解以太坊如何防止对节点硬盘和CPU的DoS攻击,以及这些防范措施对开发人员和用户有什么影响。 这意味着开发人员在决定何时写入数据时需要审慎。

Gas价格

什么可以阻止任何人上传包含10 TB静态代码的合同并耗尽网络全部节点的存储空间?或者阻止他让CPU连续不断地无效旋转? 以太坊交易与比特币交易一样,通过交易费,激励矿工处理交易,保障网络安全,但以太坊的交易费则以“gas成本”的形式出现。就像一辆汽车需要这么多加仑才能行驶这样的距离,以太坊交易需要许多以太币来运转这么多的CPU,存储大量的数据。 凭以太币作为稀缺的有价值资源这一简单优点,可以防止DoS攻击。 一个区块链的亿万富翁想通过恶作剧摧毁他们的财富,可能会让网络变慢一段时间,但获得这个恶意交易区块的获胜矿工也会有相当可观的一笔收入!

这对开发人员和用户意味着什么? 虽然从区块链的本地副本中读取是免费的,但写入计算却不是。 存储是特别昂贵的,因为任何写入的数据都需要永久存储。 运转CPU相对便宜。 在区块链中改变账户存储状态的操作始终是存储操作,因为历史状态总是被保存,而不像一般程序那样被认为是对已分配内存的操作。 以太坊是图灵完整的,所以没有什么能够阻止你编写视频编码器并将其发布到区块链:但你可能永远没有钱去使用它。 假设这样一个程序的代码至少有几千行,即使存储它也不会非常便宜。 以太坊合同可以做什么,一个很好的隐喻是:“在1999年的智能手机上能做什么呢?”

作为开发人员,这意味着您需要认真考虑代码的效率。 尤其是存储效率,但每个CPU周期都会让用户花费更多。 如果两个合同做同样的事情,那么哪个合同的效率高,就赢得一切。现在知道了智能合约的理论可能性和实际限制,就有一个问题:是什么让他们如此酷?

一个真实世界的示例

在你开始讨论小政府及智能合约所带来的其他变革性想法之前,让我们通过一个简单的现实世界的用例来展示一个智能合约,以激发你的兴趣,促使你思考。

假设我的乐队和我刚刚完成了一张新专辑,想与粉丝分享。问题是我们是朋克,倡导自由,而无论是iTunes还是YouTube,都是体制内的运转机制。我们的办法是在黑胶唱片上打印限量发行的100张专辑复制品,让每位购买者注册,到最好的潜水酒吧观看仅限购买者参加的演出。在过去的互联网上,我们可能会使用PayPal等服务来接受付款。 PayPal会在每笔交易中收费,我们则邮寄一份专辑的副本,然后在电子表格中标记,这样当第101人想购买时我们可以拒绝。这个流程不是很严密,以至于艺术家和粉丝们都不得不通过Ticketmaster和Bandcamp等中间商进行交易。幸运的是,我们的鼓手在撰写以太坊智能合约方面有一定的经验,所以我们决定编写一个简单的“注册表”来完成这一切。

注册合同很简单。 它由三个方法组成:purchase, provePurchase和claimAlbum。 粉丝通过网页传递指定数量的以太币到合同的purchase方法。 如果发送的金额大于或等于指定的价格,则计数器会递增,并且发送账户的以太坊地址将记录在数组中,数组元素是包含两个字段的结构:寄款人以太坊地址和初始值为0的领用次数.如果计数器增加超过100,交易将失败 (同时退还粉丝以太币)

购买结束后,粉丝给我们发送一个(物理的)地址,我们根据这个地址邮寄唱片。要做到这一点,claimAlbum函数可以从purchase-time中找到与发送帐户相关联的struct,并将领用次数加一。当且仅当字段等于1时,我们的网页接受粉丝的地址,然后我们将黑胶唱片邮寄给他们。我们要求用户使用与purchase方法进行交易的同一个账户,向claimAlbum函数发送了一个地址提交,从而确保我们只接受实际购买该专辑的人的地址,并且只发送一个副本。

到了演出的时候,我们怎么能保证没有人未购买我们的专辑而偷偷地溜进来呢?这是我们使用provePurchase函数的地方。门口有iPad,人们可以通过他们购买的专辑的账号用provePurchase方法验证交易。如果这些帐户存在于合同的存储数组中,provePurchase将返回true,我们知道他们购买了这张专辑。保安就会让他进去。

更重要的是,我们对专辑独家承诺可以在购买前得到粉丝的证实。以太坊合约是根据内容寻址的,这意味着它们的源代码哈希存放在链上可寻址的位置。通过合同代码开源,任何人都可以通过对源代码哈希计算并查看合同中的最终地址来独立地验证代码的功能。

这里描述的是一个简单的实现,其中省略了一些细节,但它足以让您思考智能合约的去中介化。例如,Ujo音乐以一种更加健壮和简单的方式实现了这些想法,它允许对流媒体的小额支付、下载资源的再售,使艺术家拥有更多的自由选择。更重要的是,艺术家保留了他们收入的100%。人们为了安全,向苹果支付30%的所得,而区块链几乎是免费提供服务的。

欢迎来到Blockchain世界

现在我们可以编写任意复杂度的代码,将其存储在区块链上,使用它的内容的哈希值来查找它,并期望在调用它的函数时网络中的每个节点都执行。代码输出的结果可以通过验证其过往的状态来达成所有节点间的一致性共识。这些复杂的交易就像比特币的交易一样。我们上传至区块链的代码被称为合约,实际上是去中心化应用或dapps的后端。无论从其优势(牢不可破的协议上不可变的公共记录,任何可能的输入都会产生一个可预测的结果)和局限性(比律师更便宜但不完全免费)来看,“智能合约”的概念对表现Ethereum上代码运行原理的都是一个不错的隐喻。

让我们一起建设美好未来!

原文发布于微信公众号 - java达人(drjava)

原文发表时间:2018-03-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Seebug漏洞平台

以太坊蜜罐智能合约分析

作者:dawu&0x7F@知道创宇404区块链安全研究团队 时间:2018/06/26

18850
来自专栏华仔的技术笔记

ugChain技术测评

40450
来自专栏Seebug漏洞平台

以太坊蜜罐智能合约分析

在学习区块链相关知识的过程中,拜读过一篇很好的文章《The phenomenon of smart contract honeypots》,作者详细分析了他遇到...

19730
来自专栏极客编程

学习以太坊Dapp开发

比特币设计的初衷就是要避免依赖中心化的机构,没有发行机构,也不可能操纵发行数量。既然没有中心化的信用机构,在电子货币运行的过程中,也势必需要一种机制来认可运行在...

13720

手动构建比特币交易

Andreas Antonopoulos曾经提到过,如果他将入狱,他将通过玩数独来重塑比特币共识算法的离线版本。在比特币聚会上进行这样的角色扮演比起最初想象的更...

986100
来自专栏企鹅号快讯

用不到 50 行的 Python 代码构建最小的区块链

译文:CSDN - 黑色巧克力 geek.csdn.net/news/detail/228355 ? 尽管一些人认为区块链是一个等待问题的解决方案,但毫无疑...

20200
来自专栏区块链入门

这30个以太坊开发示例,让你成为80万都挖不走的区块链人才!

我曾经买过加密货币,曾试图使用一些丑陋矿机挖矿,看过一些稀稀拉拉的Solidity教程。但不得不承认,在当时,我更****偏爱前者,我切身体会到了加密货币的狂热...

33030
来自专栏Seebug漏洞平台

以太坊合约审计 CheckList 之“以太坊智能合约规范问题”影响分析报告

作者:LoRexxar'@知道创宇404区块链安全研究团队 发布时间:2018/08/13

13520
来自专栏区块链大本营

弯道超车老司机戏耍智能合约——竞态条件漏洞 | 漏洞解析连载之三

引子:至道问学之有知无行,分温故为存心,知新为致知,而敦厚为存心,崇礼为致知,此皆百密一疏。—— 清·魏源《庸易通义》

9430
来自专栏区块链大本营

敢挑战吗?这30个以太坊开发示例,让你成为80万都挖不走的区块链人才!

我曾经买过加密货币,曾试图使用一些丑陋矿机挖矿,看过一些稀稀拉拉的Solidity教程。但不得不承认,在当时,我更偏爱前者,我切身体会到了加密货币的狂热,急切需...

15430

扫码关注云+社区

领取腾讯云代金券