我为什么要写这篇文章?在了解区块链相关信息时(例如维基百科上的内容),我发现这些内容非常零碎和不连贯。要把这些零碎的信息整合在一起,形成一个完整的视图需要花费大量的时间。不过现在,我想我已经知道在引入区块链时要使用哪些东西,以及应该按照怎样的顺序来了解它们,以便让开发人员能够在 1 到 1.5 小时内看到完整的视图。本文内容经过一定程度的简化,如果有人对更复杂的细节感兴趣,可以继续深入探讨。
非对称加密已经存在很长一段时间了,非对称加密包含了公钥和私钥。我们使用公钥加密并使用私钥解密,并且无法从这两者中的一个中获得另外一个。因此,在使用非对称加密技术时,我可以向某人发送一条信息,比如“我转账 100 美元”,每个人都知道它是我发送出去的,而且中间没有被篡改过。
假设有十个人,他们每个人都拥有一定数量(假设是美元)的新货币。他们每个人都确定(并确信)一个叫“X”的人支出了 30 万美元,但 X 是否真的拥有 30 万美元还不得而知。为了弄清楚情况,我们需要知道每个人的余额。我们只需要将他所有收入交易加起来,并扣除所有支出交易,这样就能得到余额。为此,我们需要了解有关收入和支出的信息,于是公共账本出现了。有了公共账本,我们就知道某人是否真的有能力支出 30 万美元。
比特币:开端
还有一个问题——如果我把所有钱同时发给两个人会怎样?这个问题被称为双重支出(double spending)。当然,这两个人不应该同时收到我账户里的钱。让他们自己商量谁将收到我账户里的钱?这样做不方便。通过查看时间戳来确定我把钱先转给了谁?这样做不保险。不过,还是有一个解决方案——对交易进行流水化。如果这样做了,那么很明显第一笔付款发给了 John,那么就无法再将它发给第二个人,因为我没有更多的钱。但现在还不清楚谁将决定交易的顺序。在银行和其他集中式系统中,银行本身就是受托人,也就是单一故障点和信任点,负责与第一个接收人沟通。
在区块链中,不存在这样的单个受托人,取而代之的是网络中的大部分参与者(当然,这是指将整个网络作为一个整体,因为你不能相信每个个体参与者,因为其中肯定有一些骗子)。我们假设网络不受一个人的控制,并且大多数参与者严格按照自己的经济利益行事。
但流水化交易仍然存在问题,我们还需要在网络参与者中达成“共识”。这个问题需要通过共识算法来解决,这是区块链领域的一个关键算法。
在讨论特定的共识算法之前,先让我们来说说臭名昭著的区块链的“区块”。区块是一种技术度量,是批处理的一个实例,因此我们可以以“批量”的方式计算多个交易的共识,并且网络的开销成本可以通过多个交易来“分摊”。
区块内交易的顺序由网络参与者(即生成该区块的人员,也称为“矿工”)定义,但区块本身的顺序则由共识算法来确定。共识算法已经存在了相当长一段时间。例如,多主 NoSQL 系统中的 Paxos 和 Raft 等算法就属于共识算法,但它们并不适用于拥有数百万个参与者的网络。
比特币的工作证明(proof of work,PoW)共识算法在刚开始时被认为是革命性的。许多网络参与者(矿工)同时生成新区块,那么就有必要确定区块之间的顺序。为了让一个区块成为链中的下一个区块,矿工必须进行非常耗时的散列计算。对一个区块(随同一个随机串,一个递增的数字)进行持续的散列计算,直到散列值看起来像是一个符合某些条件的大数,例如包含 10 个前导零。这需要数十亿次的散列操作,这一过程代表矿工“证明”该区块的存在。但检查矿工的工作是否正确却十分容易——只需要再进行一次散列操作。需要注意的是,整个网络(其中包括成千上万的矿工)平均在 10 分钟内(比特币生成区块的平均间隔)只可以生成一个区块 。这大大减少了出现冲突的可能性,即同时有两个或多个区块作为下一个区块。
但是,冲突的可能性仍然存在。于是就有了如下规则——网络参与者接受形成最长链的那个区块。
事实上,它不是一个链,而是一个有许多分支和链的有向无环图(DAG)。链通常被称为“共同历史”(它是最长的链)。共识不会立即达成,至少需要在生成几个区块之后,所以必须等待一段时间。为了防止比特币的双重支出,人们通常会等待六个区块(这需要一个小时)。
除了交易数据之外,一个区块还包含对前一个区块的散列值。因此,过去的某些内容不可能被修改,因为如果修改了就会使其后的所有散列无效。在挖矿过程中,你将获得奖励,也就是新的资金收益!否则的话,该如何将资金引入到这个系统呢?如果说资金必须发放给某人,那么这个人就变得很特别,这与去集中化的想法是相矛盾的。为挖矿者发钱似乎是一种合乎逻辑和可接受的解决方案。
顺便说一些关于挖矿的事。矿工的主要工作是对新区块进行散列计算,这里没有使用非对称加密技术,因为只需要在将交易添加到区块之前检查交易。比特币使用 SHA-256 散列,以太坊则使用 Keccak-256。如果你是独自挖矿,那么在生成一个区块之前,需要很长的时间(每十分钟产生一个区块,而你的竞争者有成千上百万)。因此,矿工需要聚集在一起形成矿池。在矿池中,奖励在参与者之间通过各种方式进行分配,这意味着你有可能会更经常地获得奖励。在这种情况下,风险和收益都是“分散”的。随着时间趋于无限,来自矿池开采奖励的数学期望值(无视矿池佣金)等于独自挖矿的数学期望值。
到目前为止,我们主要介绍的是网络参与者之间的数据交换,并没有深入太多细节。要记住,数据通过网络进行点对点交换,让每个挖矿者都能看到交易。
这就是比特币区块链技术。
智能合约和 ICO
让我们继续。两个操作(加法和减法)在比特币的每个账户上执行,任何人(主要是矿工)都可以检查它们。但如果我们向帐户添加内部变量并添加比较操作呢?假设当我积累了 1000 万美元时,我不想再让我的帐户继续接受资金,也就是说除了向账户添加资金的操作,还需要一定的条件。于是我们有了确定性图灵机(每个人仍然可以检查我的账户),然后是智能合同。本文所说的智能合约指的是以太坊网络中的智能合约,因为它是目前最受欢迎的智能合约。
确定性意味着在交易参数相同和存储初始状态相同的情况下,我们最终会得到相同的结果以及相同的存储变更。只有在这些条件得到满足的情况下,网络才能就每笔交易达成共识。我们必须明白,因为对确定性、可验证性和去中心化的要求,智能合约孤立于外部世界。例如,它无法调用去中心化的 Web API。另外,智能合约对外界的控制也非常有限。例如,要通过智能合约来租用公寓(交换加密货币)仍然是很困难的,因为我仍然需要确信当我来到公寓门口时,电子锁上面不会再套着一把老式的挂锁。
要了解智能合约的执行结果(新的余额或存储变更),网络节点必须执行该合约规定的操作。在多个节点上的计算不是免费的,因此,以太坊引入了瓦斯(gas)的概念,以避免出现硬编码加密货币佣金,并让用户可以计算运算数量及设置价格。这种结构提供了一个额外的间接层,让用户可以在低成本交易和快速交易之间进行选择。
当资金被发送到合约账户(通过地址)时,它便触发了回退功能,即默认的入口。与账户不同的是,合约有多个入口——因此可以接受参数。要修改合约(无论入口是什么),你必须将交易发送到网络。但是,如果你只想以只读模式查看某些内容,则可以通过使用最新的区块链在本地执行此操作。另外,与账户不同的是,智能合约没有私钥。你不能直接从余额中提取资金——这可以通过使用定义好的方法来完成,当然这些方法应该有安全限制,例如检查试图访问资金的用户的地址。
最后,我们在比特币风格的区块链上获得智能合约技术。
许多加密货币或所谓的“代币”都是基于以太坊智能合约。是的,通常这种加密货币只是一个以太坊合约。余额是 map 形式的智能合约存储条目,货币从一个参与者到另一个参与者的转移如下所示:
map[Alice] –= payment;map[Bob] += payment;
他们不需要自己挖矿和自己的网络,他们可以使用以太坊的基础设施。在以太坊中,ICO/ITO 是指加密货币(代币)的以太网交换(以太坊网络的加密货币)。 ERC20 标准说明了哪些方法必须在加密货币中定义,这要归功于交易所对加密货币的支持以及以太坊钱包提供的支持。
未来的发展
除了智能合约之外,还有很多其他建立在区块链基本概念之上的想法,比如“零知识证明(zero-knowledge proof)”和“自律网络(self-regulated network)”。
零知识证明基于同名的密码协议族,实质上,它最初用于在不解开整个对象的情况下证明该对象的所有权。例如,如果我能够说出某个文件随机十个字节的位置,那就可以证明我拥有这个 1GB 的文件。显然,在这种情况下,我将只公开了 1GB 中的 10 个字节。由于 RSA 加密涉及求幂,并且
(Y ∗ X) ^ a = Y^a ∗ X^a
所以最后变成了
encrypted(Y ∗ X) = encrypted(Y) ∗ encrypted(X)
也就是说,任何人都可以检查我的帐户余额是否正确执行了乘法预算,而且没有必要透露我的帐户上有多少钱!基于这个想法,我们可以创建一种可以保护余额和支付隐私信息的加密货币(实际上,这样的货币已经存在,如 Zcash)。
区块链提供的通用设置已经包含在网络客户端的代码中,例如区块的交易数量。通常,更改它们需要网络参与者社区接受这些更改(以代码更新的形式),这会带来网络分支的风险(当一些参与者决定不接受更改并继续使用“旧”代码)。自我监管尝试解决这些问题(参见 Tezos 或 EOS 区块链)。这个想法的本质是,对于每一次变更,都可以使用自己的资金进行投票(当然,不会失去它们)。
结论
简而言之,区块链技术走过了以下的路径:
交易签名(非对称加密技术)+ 交易的开放性 + 交易的流水化 + 到图灵机的扩展 +(零知识证明 | 自我监管 | ……)
我已经提到,许多加密货币实际上是以太坊的智能合约,也就是说它们使用了以太坊区块链。但除了比特币和以太坊之外,还有其他项目——它们在细节和主要特征方面可能会有所不同,有人已经尝试创建几乎全新的区块链,如 EOS,甚至是不同的区块拓扑,如 Tangle 和 AElf。
英文原文: https://medium.com/@Eenae/blockchain-through-the-eyes-of-a-developer-68415cc083c0
感谢郭蕾对本文的审校。
评论