1数字货币中经常出现的问题:
双花攻击 数字货币本身为带有签名的数据文件,可以进行复制。即:对用户来说,可以将同一货币花费两次。
对货币添加唯一编号(不可篡改),每次支付向货币发行单位查询真伪。 该方法每次交易都需要依赖于第三方机构来判断货币真伪且防止双花攻击。是一个典型的第三方中心化方案。现实中,我们通过一些APP进行交易时,必然会依赖于第三方机构。由于这些第三方机构具有较高的可信度,有政府进行保护,所以可以采用这种方案。 但是,很多场景下,并不存在这样一个可信赖的第三方机构。基于这个背景,以去中心化思想为核心的BTC系统便吸引了人们的注意力
2去中心化需要解决的问题:
2.1数字货币的发行由谁执行?发行多少?什么时候发行?在传统中心化货币体系中,这些问题我们可以交给第三方机构(如:央行)。当引入去中心化思想后,系统中节点平等,交易不通过第三方,那么货币发行权的分配必然是一个需要解决的问题
在BTC系统中由挖矿来决定货币发行权和发行量
2.2如何验证交易是否有效?如何防止双花攻击?同样,在传统中心化体系中,该问题的解决由第三方机构来完成。而剔除这一机构后,交易双方如何能够验证交易的有效性?如何防止系统中恶意用户作恶获取收益?这也是去中心化交易系统需要解决的问题
该问题的解决依赖于系统中共同维护的一个数据结构,记录货币的使用情况(是否被花过?被谁花过?)。该数据结构由系统中全体用户共同维护,保证了交易的有效性,该数据结构即是区块链。
3案例说明
如下假定A获得铸币权,新发布了10个比特币(该交易称为铸币交易)。A将10个比特币转给了B(5个)和C(5个),A对该交易进行签名,同时该交易需要说明所花掉10个比特币来源(来自铸币交易)。之后,B将自己的5个比特币转给C(2个)和D(3个),该交易需要B的签名,该交易需要说明所花掉的5个比特币来自于第二个交易中。然后,C将自己所拥有的全部7个比特币都转给E,并对该交易签名,可以发现该交易中C的比特币来源于两个交易中。这样,就构成了一个简单的区块链。【红色部分为比特币来源】
需要注意:这里包括两种哈希指针。第一种为指向前面区块的白色指针,使得各个区块形成区块链,第二种则是为了说明BTC的来源(红色指针),是为了说明BTC的来源并非凭空捏造,可以防止双花攻击。在实际进行交易时,需要付款人的签名和收款人的地址,在BTC系统中,该地址即为收款人公钥的哈希,可类似认为是银行账户。在交易中,收款方需要知道付款方的公钥,从而才能验证该签名是有效的。即A需要提供自己的公钥(实际上其他节点都需要知道付款方的公钥,验证交易合法性),但是不免有人可能会从中作梗,伪造A的公钥“偷走”BTC。在BTC系统中,通过执行脚本实现上述验证过程。将当前交易的输入脚本和前一个交易的输出脚本(说明币的来源)拼接起来执行,如果顺利执行,说明交易时合法的
4BTC共识协议:
背景:假设系统中存在部分节点有恶意,但存在比例较小。大多数节点为“好”的节点,在这种情况下进行共识协议设置。 想法1: 直接投票 某个节点打包交易到区块,将其发给其他节点,其他节点检查该候选区块,检查若正确投赞成票,若 票数过半数,加入区块链。
存在的问题1——恶意节点不断打包不合法区块,导致一直无法达成共识,时间全花费在投票上。
存在的问题2——无强迫投票手段,某些节点不投票(行政不作为)。
存在的问题3——网络延迟事先未知,投票需要等多久?效率上会产生问题。 更大的一个问题——membership。如果是联盟链,对加入成员有要求,可以基于投票。但,BTC系统,任何人都可以加入,且创建账户及其简单,只需要本地产生公私钥对即可。只有交易的时候,BTC系统才能知道该账户的存在。这样,黑客可以使用计算机专门生成大量公私钥对,当其产生大量公私钥对超过系统中一半数目,就可以获得支配地位( 女巫攻击)。所以,这种简单的投票方案也是不可行的。
BTC系统中采用了很巧妙的方案解决这个问题。虽然仍然是投票,但并非简单的根据账户数目,而是依据计算力进行投票。 在比特币系统中,每个节点都可以自行组装一个候选区块,而后,尝试各种nonce值,这就是挖矿。[H(block header)<=target] 当某个节点找到符合要求的nonce,便获得了记账权,从而可以将区块发布到系统中。其他节点收到区块后,验证区块合法性,如果系统中绝大多数节点验证通过,则接收该区块为最新的区块并加入到区块链中。
4.1 可能存在的问题1:会不会被合法区块拒绝?如图所示,如果发生分叉,但区块链只承认最长合法链,随着时间推移,必然有一条称为最长合法链,这样会导致合法区块被拒绝。
4.2 可能存在的问题2:分叉攻击 如图所示,A用户对上面的A转给B的记录回滚,从而非法获取利益。在两条链上,发现交易都合法。这是一个典型的双花攻击。A给B转账后,用分叉攻击将钱又转回来,覆盖掉原来的记录。 在比特币系统中,这种情况实际上很难发生。因为大多数矿工认可的是最长的合法链,会沿着上面的链继续挖下去。而A这个攻击者要想回退记录,就必须使得下面的链变得比上面的链还长。理论上来说,攻击者需要达到整个系统中51%的计算力,才能使得这种攻击成功
区块链正常运行场景下,也可能会发生分叉。当两个节点同时获得记账权时,会有两个等长的合法链。在缺省情况下,节点接收最先听到的区块,该节点会沿着该区块继续延续。但随着时间延续,必然有一个链胜出,由此保证了区块链的一致性。(被扔掉的区块称为“孤儿区块”)
5 BTC激励机制:
5.1 为什么系统中节点要竞争记账权?需要提供算力和电力成本,节点为什么要去做?
比特币系统设计之初便考虑到了这个问题,那就是引入 激励机制。比特币通过设置 出块奖励来解决该问题,一个获得合法区块的节点,可以在区块中加入一个特殊交易(铸币交易)。事实上,这种方式也是 唯一一个产生新比特币的途径。
比特币系统设计规定,起初每个区块可以获得50个比特币,但之后每隔21万个区块,奖励减半。
但是这样就可以了吗? 区块中保存交易记录,那么,会不会存在节点只想发布区块而不想打包交易?中本聪在设计该系统时,引入了交易费。在一个区块中,其输入 输出,差值便是给区块所属节点的手续费。这些会在后续文章中详细说明。