从程序员的视角看区块链会是怎样的

区块链

574人已加入

描述

这是一篇从程序员视角看区块链的文章,将区块链落地为程序员能够理解的概念,比如图灵状态机,而状态机是一种状态模式,是事件驱动建模的核心。本文适合区块链入门阅读:

不对称密码已经存在了很长一段时间,密钥有公钥和私钥之分。我们使用公钥进行加密并使用私钥解密。或相反亦然。你无法从一个密钥中获得另外一个密钥。因此,如果使用不对称加密技术,我可以向某人发送一条信息,比如“我转账100美元”,并且每个人都会知道它是由我发送的,并且没有任何改动。

假设有十个人都同意每个人拥有一百万单位的新货币。他们每个人都可以确保(并且每个人都可以确信)是有某人发送了三十万个单位。但是X是否真的拥有这些三十万个单位货币却还不得而知。为了找到答案,我们可以了解每个人的余额情况。为此,我们只需将所有收入交易加起来并扣除所有费用进行计算。由此,我们就需要有关收入和支出的信息,这就是公共账本。它可以让我们识别某个人是否真的可以发出30万个单位的货币。

比特币:开始

还有一个问题 - 如果我把我所有的钱同时寄给两个人怎么办?这被称为双重支出。如果让这两个人彼此沟通以找出谁最终获得付款是不方便的;查看时间戳以确定我首先将资金发送谁了?这种办法非fail-safe的。这里有一个解决方案 - 我们需要流线化交易,在这种流线化交易模式下,很明显能看出第一笔付款已经发给了约翰,根本无法再将这笔付款发给第二个人,因为我没有更多的钱了。

流线型交易主要是对交易进行排序,但是现在还不清楚怎么来决定交易的顺序。在银行和其他集中系统中,银行自身代表了受托人,是单点风险点,也是单点信任点。该银行可以出面澄清说,某某的钱先寄给了谁。但是在区块链中,没有单个受托人。它可能是网络的大部分参与者(当然,这意味着整个网络,因为你不能相信每一个参与者,因为其中肯定有一些骗子)。这里的假设前提是网络不受任何一个人的控制,并且大多数参与者严格按照利于自己的经济利益行事(自利)。

但是流线型交易的一致性问题仍然没有彻底解决 - 这就要求我们在网络参与者中实现一种称之为“共识”的机制。这个问题是由一个共识算法处理的,这是每个区块链中的一个关键算法。

在我们讨论一个特定的共识算法之前,先说说区块链的块。块是一种技术措施,是批量处理(称为批处理)的一个实例,因此许多交易能在一个“批量”内计算以达成共识,并且网络的间接费用可以跨多个交易中“分摊”。块内交易的顺序是由网络参与者(即生成该块的人员(也称为“矿工”))定义的。但块之间的顺序由共识算法确定。共识算法存在相当长的一段时间。例如包括多主NoSQL系统中的Paxos和Raft等算法。但这些算法并不适合拥有一百万对参与者的网络。

比特币在它出现的时候代表了相当革命性的东西 - 一种工作证明(PoW)共识的算法。许多网络参与者(矿工)会同时生成很多新块。因此有必要决定这些块中的哪一个块能够被真正用作区块链的下一块。

为了使自己产生的块成为区块链中真正的下一个块,矿工必须执行特别挑选且非常耗时的哈希计算。当一个哈希数值计算到一个大数字,且必须符合某些条件,比如必须前面包含10个零。这就会需要数十亿次哈希计算,这个计算量就代表矿工能“证明”其块的确实存在的证据。同时,检查这项工作是否正确完成是非常容易的 - 您只需要一次哈希操作。必须了解到的是:平均而言,整个网络(其中包括成千上万的矿工!)在10分钟内就可以生成一个区块(比特币生成区块的平均间隔)! 。这大大降低了旷工之间碰撞的可能性,即就不可能同时有两个矿工提供两个或更多的块作为下一个块。

但是,发生碰撞的可能性还是可能存在的。因此,存在这样规则 - 网络参与者接受形成最长链的块(当有两个块同时生成时,选择其中一个更长的链的块)。

事实上,它不是一个链,而是一个有许多分支和有向无环图(DAG)的链,而链通常被称为“共同历史”(它是最长的链)。既然共识不能立即达成,你就必须等待一段时间直到出现几个块之后。为了防止比特币的双重支出,人们通常会等待六个块(在比特币里需要花费一个小时)。

除了事务之外,块还包括前一个块的哈希。因此,过去历史就不可能被修改,因为这会使随后的所有哈希无效。同时,连接到同一个块,您会获得挖矿奖励,这会给您带来新的收益!否则,就无法将新资金引入这个系统中 - 资金将不得不发放给某人,这会使这个人变得特殊,这与分权的想法会形成矛盾。为挖矿发钱似乎是一种合乎逻辑和可接受的解决方案。

顺便说一句,关于挖矿。你需要明白,矿工的主要工作是猛烈地哈希计算出新块; 这里没有非对称加密技术,因为这里仅仅需要在交易加入块之前检查交易。比特币使用SHA-256哈希; 在以太坊中,它是采取Keccak-256。如果你是单独开采,那么在你生成一个区块之前,需要准备好长时间(每十分钟产生一个区块,你的竞争者数量达到数百成千上万的!)。如果矿工聚集在一起。在一个池中,参与者之间的奖励是以各种方式分配的(有不同的方法),这意味着您可以更经常地获得奖金(尽管数量比较少)。在这种情况下,风险和收益都是成正比的。

到目前为止,我们主要处理的是网络参与者之间的数据交换,而没有深入细节。牢记数据通过网络对等进行交换是非常重要的。

这就是比特币区块链技术。

智能合约和ICO

在比特币的每个账户上执行两个操作(加法和减法),并且可以由任何人检查,当然主要由矿工检查。但是如果我们将一个内部变量添加到帐户(存储),它是用来进行操作比较的,假设我积累了1000万美元时,我想让我的帐户停止接受资金 - 这意味着代码实现上不仅要将资金能够增加到我的帐户中,还要为这种增加再添加一定的条件。通过开发这个角度看过去,我们看到的是一个图灵机,一种确定性的类型(每个人仍然可以检查我的账户)。因此,我们有了一个智能合约。在下文中,智能合约指的是以太坊网络中的智能合约,因为它是目前最受欢迎的合约。

确定性意味着,在有相同的交易参数和存储的初始状态相同的情况下,我们最终会得到相同的结果,以及存储中同样的更改动作(banq注:操作事件)。只有在这些条件下,网络才能就每笔交易达成一致。

这里必须明白,由于要求确定性,可验证性和分散性,智能合约与外部世界相当孤立。例如,它不能触发分散式Web API(有解决方案,即所谓的“oracles”,但这些都很复杂,需要分别处理)。

另外,合同对外界的控制也非常有限。例如,要了解智能合同执行结果(新余额或存储的更改动作),网络节点必须执行该合同规定的操作。在多个节点上进行计算不是没有成本的。因此,以太坊引入了gas 的概念,以避免加密货币硬编码进行计算带来的成本,并允许用户计算计算次数并设置其价格。这种结构提供了一个额外的间接层,它允许用户在低成本交易和快速交易之间进行选择。

当资金被发送到合约账户(通过简单地使用地址)时,它触发回调函数,这是默认设置。与前面比特币的帐户类型不同,智能合约的合约中有多个输入点 - 这些是可以接受参数的方法。要修改合约(无论输入点是什么),您必须将交易发送到网络才能进行更改。但是,如果您只想以只读模式查看某些内容,则可以通过使用实时更新的区块链在本地执行此操作。另外与账户不同的是,智能合约没有私钥。您不能直接从余额中提取资金 - 这可以通过使用明确定义的方法来完成,当然这些方法应该有安全限制,例如检查试图访问资金的用户的地址。

最后,我们在比特币风格的区块链上获得了智能合约技术。

许多加密货币或所谓的“代币tokens”都基于以太坊智能合约。是的,通常这种加密货币只是以太坊中的一个合同(一个!)。余额通常是智能合约存储中的map数据类型的一个数据条目,并且从一个参与者转移货币到另一个参与者如下:

map[Alice] –= payment;

map[Bob] += payment;

他们不需要自己的旷工和网络 - 他们可以使用以太坊的基础设施。在以太坊,ICO / ITO实际就是加密货币(tokens)的以太网交换(以太坊网络的加密货币)。

未来发展

除了智能合约之外,基于区块链的基本概念之上还有很多其他想法,比如“零知识证明”和“自律网络”。

零知识证明是基于密码协议的同名家族,实质上,它被设计为证明对象的所有权但不完全暴露它。例如,如果我能够回答关于某文件的各种随机位置中有关字节的十个问题,我就可以证明我拥有一个特定的1 GB文件。显然,在这种情况下,我只需公开1 GB中的10个字节即可。

这意味着可以让任何人检查我的帐户余额是否正确,同时却没有必要透露我的帐户上有多少钱!通过构建这个想法,我们可以创建一个包含余额和支付隐私信息的加密货币(实际上,它已经存在了;参见Zcash),并且完全隐藏了智能合约中计算参数。

区块链有写入网络客户端程序代码的网络通用设置,例如包含在该区块中的交易数量。通常,更改它们需要网络上所有参与者接受这些更改(以代码更新的形式出现),这会带来网络分支的威胁(当一些参与者决定不接受更改并继续与“旧”码)。Self-regulation试图解决这些问题(例如,参见Tezos或EOS区块链)。这种想法的本质是,对于每一次变更,您都可以用自己的资金进行投票(当然不会失去这些资金)。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分