我将以比特币为例介绍区块链是如何工作的。
为了跟踪我们每个人拥有的比特币数量,我们使用一个ledger--一个数字文件跟踪所有的比特币交易。
ledger不存储在中央服务器(如银行)或单个数据中心。 它通过计算机网络分布在世界各地。 这些计算机中的每一台都代表区块链网络的“节点”,并具有ledger的副本。
如果David想将比特币发送给桑德拉,他会向网络发送一条消息,表示他账户中比特币的数量应该减少5 BTC,桑德拉账户的数量应该增加相同的数量。 网络中的每个节点都将收到该消息并将所请求的交易记录于其ledger的副本,从而更新账户余额。
为了能够在区块链上执行交易,您需要一个wallet,一个允许您存储和交换您的比特币的程序。 由于只有您应该可以使用您的比特币,因此每个钱包都受到特殊加密方法的保护,该方法使用一对不同但连接的密钥:私钥和公钥。
如果消息使用特定公钥加密,则只有配对私钥的所有者才能够解密并读取消息。 另一方面,如果您使用私钥对消息进行加密,则只能使用配对的公钥进行解密。 当大卫想发送比特币时,他需要广播一个用他的wallet的私钥加密的消息,所以他和他只能花他自己拥有的比特币,因为大卫是唯一知道他自己的私钥的人才能解开他的钱包。 网络中的每个节点都可以通过用他的wallet的公钥解密交易请求消息来交叉检查交易请求是否来自David。
当你使用wallet的私钥对交易请求进行加密时,会生成一个数字签名,区块链计算机将使用该签名来仔细检查交易的来源和真实性。 数字签名是由您的交易请求和您的私钥组合而成的一串文本,因此不能用于其他交易。 如果你更改交易请求消息中的一个字符,数字签名就会发生更改,因此潜在攻击者无法更改您的交易请求或更改您发送的比特币金额。
区块链中的每个节点都保留ledger的副本。 那么,节点如何知道您的账户余额是多少? 区块链系统根本不跟踪账户余额,它只记录所请求的每一笔交易。 ledger实际上并未追踪余额,只跟踪在比特币网络内广播的每笔交易。 要知道您的钱包余额,您需要分析和验证整个网络上连接到你的wallet的发生的所有交易。
这个“余额”验证是由以前的交易的链接执行的。 为了向John发送10比特币,Mary必须生成一个交易请求,该交易请求包含一些以前传入交易的链接。 这些链接被称为输入,网络中的节点将验证这些交易的总数等于或超过10比特币,并且这些输入尚未消耗。 这一切都在Mary的wallet中自动执行,并由比特币网络节点进行双重检查,她只使用John的公钥向John的钱包发送10 BTC交易。
但是,这个操作安全吗,为什么它被称之为区块链?
可用的比特币地址总数为2¹⁶⁰或461501637330902918203684832716283019655932542976.这个庞大的数字可以保护网络免受潜在的攻击,同时允许任何人拥有钱包。
然而仍然存在一个重大的安全漏洞,可以在花掉比特币后回收他们。 交易在网络中从节点传递到节点,因此两个交易到达每个节点的顺序可能不同。 攻击者可以发送交易,等待对方运送产品,然后将比特币发送回自己的帐户。 在这种情况下,一些节点可能在第一个交易之前接收到第二个交易,并且因为第一个交易的输入结果已经花费了,所以他们认为第一个支付交易无效。 您如何知道首先请求了哪个交易? 通过时间戳验证交易是不安全的,因为它很容易被伪造。 因此,没有办法确定交易是否发生在另一个交易之前,这就可能导致欺诈行为。
比特币网络将订单交易放在blocks里面,每个block包含一定数量的交易并且链接到前一个block。 因此,block被组织成一个时间相关的链,它给整个系统命名:blockchain。
同一block的交易被认为是同时发生的,而尚未在block中的交易被认为是未经确认的。 每个节点都可以将事务组合到一个block中,并将其广播给网络,作为下一个block的建议。 由于任何节点都可以建议一个新block,因此系统如何就下一个block达成一致?
为了添加到区块链中,每个block必须包含使用不可逆密码散列函数创建的复杂数学问题的答案。 解决此类数学问题的唯一方法是猜测随机数与前面的block内容相结合生成的结果(通常是某个值以下的数字)。 典型的计算机可能需要大约一年的时间才能猜出正确的数字并解决数学问题。 然而,由于网络中计算机的数量很大,所以猜测数字的平均时间为10分钟。 解决这种数学问题的节点获得将下一个block放置在链上并将其广播到整个网络的权利。
如果两个节点同时解决问题并将其block同时传播到网络又会如何呢? 在这种情况下,两个block都被广播,每个节点都建立在它首先接收到的模块上,然而区块链系统要求每个节点立即建立在可用的最长模块链上。 因此,如果对最后一个块是哪个模糊不清,只要下一个block被解决,每个节点将采用最长的链作为唯一的选项。
不过这种情况发生的概率很低。
关于哪个block代表区块链“尾巴”的分歧,再次打开了欺诈的可能性。 如果交易发生在属于较短尾部的block内,那么一旦下一个block被解决,该交易将回到未确认的交易,就像block B中包含的所有其他交易一样。
让我们来看看Mary如何利用链末端模糊来执行双重支出攻击。 Mary向John发钱,然后John将产品发送给Mary,因为节点总是采用较长的尾部作为确认的交易,如果Mary可以生成一个较长的尾部,其中包含反向交易,那么John将损失他的钱和他的产品。
那么系统如何防止这种欺诈?每个block都包含对前一个block的引用,并且该引用是需要解决的数学问题的一部分,以便将接下来的block传播到网络。所以要预先计算一系列block是非常困难的,因为需要大量的随机猜测来解决block并将其放置在区块链中。Mary需要与网络的其他部门进行竞赛,以解决数学问题,使她能够将下一个block放在链条上。即使她先于其他人解决了这个问题,她也不太可能连续解决2,3个或更多的问题,因为每次她都在与整个网络进行竞争。那么,Mary能否用一台超级快速的计算机来产生足够的随机猜测来与整个网络进行竞争以解决问题?是的,但即使计算机运行速度非常快,由于网络中有大量成员,因此Mary很可能无法在执行双重支出攻击所需的一定时间内连续解决几个block。
她需要控制整个网络的计算能力的50%,以便有50%的机会在其他节点之前解决一个block,即使在这种情况下,她也有25%的机会连续解决两个块。 需要连续解决的块越多,Mary可以成功的概率就越低。
因此,随着时间的推移,交易变得越来越安全。 包含在过去已经确认的block中的那些交易比最后一个block中的更安全。 由于block平均每10分钟被添加到链中,1小时后交易已被处理且不可逆的概率就非常高。
为了能够发送比特币,您需要发起一个将比特币发送到您的钱包的交易,这适用于网络中发生的所有交易。 那么,比特币最初来自哪里?
为了平衡由于软件错误和钱包密码丢失而产生的通缩,对那些解决每个block的数学问题的人给予了奖励。 运行比特币区块链软件以获得这些比特币奖励的活动被称为“采矿” - 非常类似于采金矿。
此奖励是推动私人操作节点的主要动机,从而提供处理比特币交易和稳定区块链网络所需的必要计算能力。
由于普通的计算机需要很长时间才能解决一个块(平均约1年),所以通过节点聚集在一起,每个节点一起猜才能解决下一个block。 通过这种方式,小组能够更快地猜出正确的数字并获得小组成员之间共享的奖励。 这些组称为采矿池。
其中一些采矿池相当大,占整个网络计算能力的20%以上。 这对于网络安全有明显的影响,如上面在Mary双重花费攻击示例中所见。 即使其中一个池可能获得50%的网络计算能力,一个block获得的链越往后,其中包含的交易就越安全。
然而,其中一些拥有大量计算能力的矿池决定限制其成员数量,以保障整体网络安全。
由于技术创新和节点数量的增加,整体网络计算能力可能会随着时间的推移而增加,因此区块链系统重新校准解决下一个block的数学问题难度,以确保整个网络平均10分钟的解决时间。 这确保了网络稳定性和整体安全性。
此外,每4年block奖励减少一半,因此随着时间的推移,挖掘比特币(=运行网络)变得不那么有趣。 为了防止节点停止运行网络,可以将小的奖励费用附加到每个交易,这些奖励由那些成功地在块中交易并解决其数学问题的节点收取。 由于这种机制,与较高奖励相关联的交易通常比与较低奖励相关联的交易处理得更快。 这意味着在发送交易时,您可以决定是否要更快地处理它(=更昂贵)或更便宜(=需要更多时间)。 如果与银行收费相比并且与交易金额无关,比特币网络中的交易费用目前非常小。
以上来自https://medium.com/@micheledaliessi/how-does-the-blockchain-work-98c8cd01d2ae