简化付款确认
可以在不运行完整网络节点的情况下验证支付。用户只需要保存最长的工作证明链的块头副本,他可以通过查询网络节点获得这个副本,直到他确信自己拥有最长的链,并获得将事务链接到它所标记块的Merkle分支。他不能自己检查事务,但是通过将其链接到链中的某个位置,他可以看到一个网络节点已经接受了它,并在它进一步确认网络已经接受它之后添加块。
因此,只要诚实的节点控制网络,验证是可靠的,但是如果网络被攻击者制服,验证就更容易受到攻击。虽然网络节点可以自己验证事务,但是只要攻击者能够继续控制网络,简化的方法就会被攻击者编造的事务所欺骗。防止这种情况发生的一种策略是,当网络节点检测到无效的块时,接受来自网络节点的警报,提示用户的软件下载整个块,并提醒事务确认不一致性。经常收到付款的企业可能仍然希望运行自己的节点,以获得更独立的安全性和更快的验证。
如果大部分CPU功率合谋说谎,那么网络显然不再安全。如果使用51%的攻击,那么这个简单的方法将很容易被愚弄,人们将希望拥有完整的区块链。
隐私
一个典型的模型是,身份与通过受信任的第三方然后在交易对手处结束的交易相关联。在这个模型中,网络的其他部分不知道双方之间进行的某些交易。
在比特币协议模型中,身份是一个单独的部分,交易以分类账的形式通过公众进行。
作为一个额外的防火墙,应该为每个事务使用一个新的密钥对,以防止它们链接到一个公共所有者。但是,存在这样一种风险:如果密钥的所有者被公开,链接可能会显示属于同一所有者的其他事务。
使用区块链
区块链提供了可公开编写的全局仅追加日志。参与区块链网络的节点遵循块头协议来决定哪个节点可以编写下一个块并收取特定的事务费。在每一轮的领导人选举中,只有一个节点可以写入一个块。区块链中的节点维护它的完整和更新版本。独立验证和添加到区块链的挖掘过程包括运行计算密集型软件来解决复杂的数学问题,这种困难被称为“工作证明”(proof-of-work, POW)。POW基于加密哈希函数。为了使块可以接受,它的头哈希必须在前面加上一定数量的0,其中哈希是时间段内所有事务的Merkle根、前一个块和nonce的组合。 Merkle根是通过哈希值数据、将结果与另一对数据配对并再次将所有事务数据都包含在最后一个哈希中而形成的。矿工搜索’ nonce ‘,它的前缀块头有足够的0来满足POW条件。一旦POW被解决,新的块将通过网络传输。然而,在使用区块链构建系统时存在一些挑战,比如数据存储的限制、写入速度慢、带宽有限等。
哈希函数是将任意大小的输入数据转换为固定大小的输出数据。数字签名是公钥密码学(也称为非对称密码学)的派生,公钥密码学使用两个不同但在数学上相连的密钥,一个是私有的(这是秘密的),另一个是公共的(与他人共享的)。
代码
要深入理解区块链技术,我们需要通读实现它的代码。
区块链的基本概念非常简单:一个分布式数据库,它维护一个不断增长的有序记录列表。比特币和以太坊等流行的区块链项目就是这种情况。术语“区块链”通常与事务、智能合约或加密货币等概念紧密相关。
这使得理解区块链成为一项困难的任务。尤其是source-code-wisely。在这里,我将介绍一个超级简单的区块链,它是我用200行Javascript实现的,名为NaiveChain。
块结构
第一个逻辑步骤是决定块结构。为了使事情尽可能简单,我们只包括最必要的:索引、时间戳、数据、哈希和以前的哈希值。
块哈希
块需要哈希值以保持数据的完整性。SHA-256接管块的内容。应该注意的是,这个哈希值与“挖掘”无关,因为没有要解决的工作问题。
生成一个块
要生成一个块,我们必须知道前一个块的哈希值,并创建所需内容的其余部分(=索引、哈希值、数据和时间戳)。块数据是由最终用户提供的。
存储块
内存中的Javascript数组用于存储区块链。区块链的第一个块总是所谓的“起源快”,它是硬编码的。
验证块的完整性
在任何给定的时间,我们必须能够验证一个在完整性方面是否有效。尤其是当我们从其他节点接收新块并必须决定是否接受它们时,更是如此。
选择最长的链
在给定的时间内,链中应该始终只有一个显式的块集。在发生冲突的情况下(例如两个节点都生成72个块),我们选择块数最长的链。
与其他节点通信
节点的一个重要部分是与其他节点共享和同步区块链。以下规则用于保持网络同步。
· 当一个节点生成一个新的块时,它向网络广播它
· 当节点连接到新的对等点时,它查询最新的块
· 当节点遇到一个索引大于当前已知块的块时,它要么将该块添加到当前链中,要么查询完整的区块链。
不使用自动对等发现。必须手动添加对等点的位置(= url)。
控制节点
用户必须能够以某种方式控制节点。这是通过设置HTTP服务器来完成的。
与其他节点通信
节点的一个重要部分是与其他节点共享和同步区块链。以下规则用于保持网络同步。
· 当一个节点生成一个新的块时,它向网络广播它
· 当节点连接到新的对等点时,它查询最新的块
· 当节点遇到一个索引大于当前已知块的块时,它要么将该块添加到当前链中,要么查询完整的区块链。
不使用自动对等发现。必须手动添加对等点的位置(= url)。
控制节点
用户必须能够以某种方式控制节点。这是通过设置HTTP服务器来完成的。
可以看出,用户可以通过以下方式与节点进行交互:
列出所有块
使用用户提供的内容创建一个新块
列表或添加对等点
最直接的控制节点的方法是使用Curl:
从节点获取所有块
curl http://localhost: 3001 /块
体系结构
应该注意的是,节点实际上公开了两个web服务器:一个用于用户控制节点(HTTP服务器),另一个用于节点之间的对等通信(Websocket HTTP服务器)。
第一部分