点击上方“csdn”,选择“置顶公众号”
关键时刻,第一时间送达!
【编者按】区块链自诞生那天起就是互联网业界最富有争议与分歧的技术之一。它是比特币和其他加密货币幕后的核心技术,最近几年来引起了广泛的关注。
区块链的核心是分布式数据库,任何两方之间可以进行直接交易,而无需经过权威的中间机构。这个简单而又强大的概念对银行、政府以及市场等各种机构带来了很大影响。任何以中心化数据库作为核心竞争优势的商家或组织都有可能受到来自区块链技术的威胁。
这篇文章的主要目标是从实用的角度介绍区块链,不会讨论比特币等加密货币的价格等炒作。第一小节和第二小节将介绍区块链背后的核心概念,第三小节将介绍使用python实现区块链的方法。同时还会介绍两个web应用程序,帮助终端用户轻松地与区块链交互。
请注意我在这里使用比特币作为例子向大家介绍更为通用的“区块链”技术,本文中所介绍的大多数概念也同样适用于其他区块链以及加密货币。
以下是我们将在第三节中创建的web应用程序的动画截图。
1. 区块链速成
区块链的一切源自2008年,一位匿名人士或组织以中本聪的名义发表的一篇白皮书。这篇白皮书的题目为《比特币:端对端的电子货币系统》(原文请参照这里:
2.4 向区块链追加区块
比特币网络中的所有矿工都在互相竞争,找到合法的区块追加到区块链,并获得奖励。为一个合法的区块找到nonce是低概率的事件,但是因为矿工的数量众多,所以由某个矿工找到一个区块的概率就非常高了。第一个提交合法区块的矿工可以将自己的区块追加到区块链,并获得比特币的奖励。但是如果两个或多个矿工同时提交区块会怎么样呢?
解决冲突
如果有两个矿工同时挖到了一个区块,那么网络中就会出现两个不同的区块链,那么我们需要等下个区块出现才能解决这个冲突。一些矿工决定继续开采区块链1,而其他人则选择区块链2。第一个找到新区块的矿工可以解决这个冲突。如果新区块是在区块链1上开采出来的,那么区块链2就失效了,所以前一个区块的奖励就要给区块链1中的矿工,且区块链2中的交易不会被加入区块链,所以它必须返回交易池与区块链1同步,然后继续下个区块。简而言之,如果区块链中有冲突,那么最长的那个链说了算。
图片:解决冲突——最长的链说了算
2.5 区块链与双花
在本节中,我们将介绍区块链上应对双花攻击的最流行的做法,以及用户可以采用的防范措施。
速度攻击
一个攻击者以非常快的速度将同一个货币发到两个地址。为了阻止这种攻击,我们推荐至少等到下一个区块被确认再接受付款。
finney攻击
一个攻击者预先挖掘出一个交易的区块,并在公布这个区块之前,在另一个交易中花掉同一个比特币。这种情况下,第二个交易将会是无效的。为了阻止这种攻击,我们推荐至少等6个区块被确认后再接受付款。
主要攻击(也被称之为51%攻击)
在这种攻击中,攻击者必须拥有网络中51%的计算力。这个攻击者可以创建一笔交易,并广播到整个网络中,然后在一个秘密的区块链上双花前一笔交易的货币,然后在此区块链上开采。由于该攻击者拥有主要的计算力,所以他肯定可以在某一时刻拥有比“诚实”的网络更长的链。之后,他可以用自己更长的区块链代替“诚实”的区块链,并取消原始的交易记录。因为这种攻击在比特币等区块链中非常昂贵,所以不大可能会出现。
3. 用python实现区块链
在本节中,我们将用python实现基本的区块链以及区块链的客户端。我们的区块链将拥有下列特征:
可以向区块链添加多个节点工作量证明(proof of work:pow)两个节点冲突的简易解决方案使用rsa加密交易我们的区块链客户端将拥有下列特征:
基于rsa算法,使用公钥/私钥加密算法生成钱包用rsa加密算法生成交易我们还将实现两个dashboard:
面向矿工的“区块链前端”面向用户的“区块链客户端”,提供生成钱包和发送货币的服务区块链的实现大部分基于github上的这个项目:https://github/dvf/blockchain。为了在交易中使用rsa加密,我对原始代码做了一些改变。生成钱包和交易编码源于这个jupyternotebook:https://github/julienr/ipynb_playground/blob/master/bitcoin/dumbcoin/dumbcoin.ipynb。而两个dashboard是用html/css/js从零编写...