前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >以太坊:比特币+一切可能

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

作者头像
java达人
发布2018-07-31 17:01:31
8650
发布2018-07-31 17:01:31
举报
文章被收录于专栏:java达人java达人

作者: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上代码运行原理的都是一个不错的隐喻。

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-03-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 java达人 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档