比特币概念由中本聪2009年提出,是一种P2P形式的数字货币,点对点的传输意味着一个去中心化的支付系统。
比特币核心技术是区块链技术,这是一种全新的思想,这种技术建立于一个缺乏信任的通讯网络当中如何构建一个去中心化的交易模式。
现在我们社会交易都离不开货币,我国使用的是人民币进行交易,然后支付宝和微信支持电子货币,其中有一个共同特点就是,这些货币都会有一个中间的监管平台负责管理整个平台的货币管理。比如支付宝后台负责货币的消费、充值以及转账。试想一下,如果说一个没有信任的环境下,人们是否会去相信这样的一个中间的平台来管理自己的财产。在支付宝刚刚上线的时候,用户量为0的时候,是什么让用户愿意把自己的钱投入到支付宝的平台上的?其中最重的就是信任关系网络,支付宝不仅仅是支付宝,它建立了一个人们普遍能接受的信用体系,以此为依托才有了淘宝和之后的其它产品。
那么对于在一个缺乏信任的网络上的节点来说,如果某一个匿名告诉你,它有一个安全的支付平台,你可以把自己的资金转入,然后能在任何一个地方消费,是否会相信?注意重点在于网络节点之间缺乏信任,这表现在你看到的ip可能并不是他的真实ip,你很难根据现有的信息找到这个节点的具体位置,对方提供的信息你也无法保证真实性。可以想象,很难在这样的环境中建立一个安全的中间平台负责交易。
那么区块链技术如何解决呢?区块链技术利用了一个庞大的节点网络的大部分节点的共同承认某一个事件为真来承认该事件来解决信任问题,也就是说,如果对于某一个计算结果,如果网络中的大部分节点都认为这个结果为真,那么这个结果就被所有人承认了;那么接下来总结一下基于这种模式设计的比特币更细节的原理:
区块链是比特币的交易记录的账本,每一个想要使用比特币交易网络的用户首先需要注册一个账户,这个账户是一个使用非对称加密技术得到的两把“钥匙”,一个是公钥,类似于用户名,一个是私钥,类似于密码,公钥可以计算出账户的地址,私钥可以计算出公钥,但是不能反过来,在一笔交易中需要有比特币的转出地址和转入地址以及交易数量;
区块链的链是如何形成的呢?每一块区块由区块头和交易信息组成,区块头中保存了上一个区块的hash值,这样就形成了一个链式的结构,在一个已经形成的链里边,如果要修改其中一个链的结果,那就需要修改这个区块以及之后的所有区块内容,并且还需要取得其他大部分节点的承认,在高额的计算成本之下,这种情况是不可能被实现的,因此可以实现数据的唯一性。
注意这种情况的前提是前一块区块中任何一个数据的修改都会使其hash值发生变化,这表示如何设计一个hash函数让区块的数据具有“唯一性指纹”非常重要,并且这也是区块链安全的前提保证。
比特币采用的SHA256加密算法保证了数据的“唯一性”,并且不会被反向解析,也就是说不能通过hash值计算出数据。
在这样的前提下,我们可以建立一个安全的链式结构,这个链式结构中后一个通过hash值指向前一个,并且基于hash值保证了结构的唯一性,那么,如何在这个结构当中存储数据呢?
区块由区块头和交易信息组成,交易信息里保存的就是交易的数据,包括每一笔交易的转出转入地址,后边讨论更多的细节问题。
然后区块链自身的hash值通过自身拥有的全部数据计算出来,也就是说包括前一个节点的hash,本身的交易记录等等,一旦有人想修改某一个节点的交易记录就会导致该节点的hash值变化然后不被后边的节点所承认。
在上边的描述中,建立了一个安全的可以保存交易数据的区块链,那么交易由谁来负责记录,交易的货币—比特币又从何而来?
在上边的描述中我们可以知道,如果我们需要加入一个新的节点,那么我们需要获取最新的区块链hash值,这个很容易查到,然后是获取当前区块链网络中的交易记录,这个通过P2P网络可以获得,然后组装出一个新的区块,并在区块链网络中进行广播,然后其他的节点同步。这里就有很多的细节问题了,为什么一个节点要帮助区块链生成新的区块?如何解决多个节点同时生成区块的问题?
首先,为什么一个节点需要消耗自己的资源去为区块链计算新的节点?这就是奖励机制,也是比特币最初的来源的地方,比特币刚刚发行的时候规定每个区块的记录者可以获得50个比特币的奖励,,在交易记录的第一个记录中保存这个特殊的交易,叫做coinbase交易;然后是记录网络中尚未被记录的其他交易,形成一个新的区块,这里还需要保证的是每个区块的大小不能超过1M,现在平均一个区块中会保存500笔交易记录。
第二个问题,如何解决多个节点同时生成的最新区块?因为奖励机制的存在,很多节点都会去竞争这个记录者,这就会导致可能会出现多个区块;比特币使用工作量证明的方式来解决问题,因为每个数据块都会根据自己的数据生成自己的数据指纹,在区块中加入一个nonce字段,用来存放一个随机数,然后根据变化这个随机数使得区块可以生成不同的数字指纹,然后再加入一个难度字段,表示生成的数字指纹必须满足某种条件才算合理,这样的话在难度设置合理的情况下,就可以从概率上降低在同一时间同时出现两个区块的情况。比特币要求计算出来的数字指纹满足前n个值为0,可以想象在hash函数生成值没有规律的情况下,n越大,计算难度也就越大,这样的话每个节点如果想要获得奖励,就需要去枚举这个nonce值以生成满足条件的hash值,然后组装出新的区块,并广播,直到大部分人都承认了之后这个节点就被加入了区块中。
如今的区块数据总量已经有80多G,也就是说如果你要加入这个挖矿网络中,你需要先下载一个80G的电子账本。
那么节点之间如何解决广播的问题呢?由于区块链网络是一个P2P网络,因此没有一个固定的中间转发服务器来转发数据;比特币这里使用的是DNS服务器,通过向DNS服务器发起查询可以得到ip地址然后实现数据广播。
1 #!/usr/bin/python
2
3 import socket
4 import json
5
6 if __name__ == '__main__':
7 nodes = socket.getaddrinfo("seed.bitcoin.sipa.be", None)
8 print json.dumps(nodes, indent=2)
这个代码可以通过向DNS服务器发起查询找到ip地址列表,在比特币客户端中,DNS服务器是写死在代码中并且有专门的人进行维护的。
在比特币最开始的设计当中,最开始每一笔交易奖励50个比特币,然后每210000个区块之后,奖励数额减半,可以计算出比特币的总量是有限的,不会超过2100w,这样种总量上限不变的特性,导致比特币有了一些特别的属性,比如收藏属性。那么在比特币挖矿达到上限之后,挖矿没有来收入来源,矿工退出导致网络节点的下降,比特币又怎么办呢?其实矿工的收入不仅仅是记录区块时的奖励,还有为别人记录账单的手续费;因为每一个区块大小的限制导致不能保存过多的交易记录,那么如果交易记录过多,记录着如何选择呢?这里交易对象可以在交易记录中放置一份小费,记录者根据小费选择交易记录进行存储,因此矿工会有一笔额外的收入,自然小费越高,就会越快地被保存在区块中。
因为去中心化的缘故,导致没有任何机构可以监管货币的交易过程,因此很多不法分子利用比特币作为交易货币,再加上比特币通缩性的性质,导致比特币在一段时间内价值持续升高。但是当奖励趋近于零的时候,如何维持节点数量保持网络的稳定,我认为这是一个需要考虑的问题,另外就是现在的账本太大,导致一个普通用户想要进入网络中需要承担的成本也会比较大。
但是,比特币给我们带来的不仅仅是比特币,我们应该更多的在意区块链这个技术,它在一个复杂并且不受信的网络环境中建立了一个去中心化的信用机制,我们如何利用这个技术去实现更多的产品以及谋求更大的利益,这才是应该考虑的。
网友评论