PHP程序员如何基于比特币开发各种相关功能

什么是比特币

当我们谈到比特币时,其实在不同的场景下有不同的指代。

比特币首先是一种数字加密货币,用户可以通过比特币网络进行 比特币转账或商品结算,就和传统的货币一样:

PHP程序员如何基于比特币开发各种相关功能

不过比特币是基于密码学技术的虚拟化货币,它没有实体,仅仅 隐含在从发送方到接收方的交易中,接收方必须使用其持有的密钥来 消费收到的比特币。

对于科技从业者而言,比特币则更多了一层含义:比特币对应着 一种划时代的数字加密货币系统,其内容包含通信协议、激励机制、实现代码 与承载网络等:

PHP程序员如何基于比特币开发各种相关功能

事实上,比特币是数十年来密码学技术、分布式计算等领域的集大成者, 它不是第一个出现的数字货币,但无疑是最成功的,一个洞察了人性的虚拟产品。

区块链结构

比特币是一个专用数据库,它只保存一种类型的数据记录 —— 交易,例如 张三转给李四几个币,或者李四转给王五几个币:

PHP程序员如何基于比特币开发各种相关功能

一旦涉及到资金,大家都会变得慎重了。因此交易记录最好在技术上可以保证 是不能篡改的,这样出了问题可以翻翻老账,这就要求账本必须值得信赖。

比特币采用一种特殊的数据结构区块链/Blockchain来保障交易的不可篡改性, 每一个包含一批交易数据的区块,同时也包含了前一个区块的指纹:

PHP程序员如何基于比特币开发各种相关功能

在比特币中,一个区块的指纹是使用密码学中常见的哈希函数来实现的。 哈希函数可以将大块数据压缩成精简的表示,而且可以保证如果精简 的表示不同,那么其对应的原始数据也不同。

例如,在上图中如果12#区块被攻击者篡改,那么它的哈希结果将不同于在 13#区块中保存的其原始指纹,这使得识别篡改的区块这一任务很容易,或者 说篡改的难度很大 —— 攻击者必须同时修改12#之后的所有区块才能保证 指纹校验成功。

另一方面,如果攻击者直接篡改14#区块(我们假设这是最后一个块),那么 显然是可行的,因为它缺乏之后更多区块的保护。这引入了在比特币中常用 的一个概念:交易的确认数/Confirms

交易一旦被确认打包到区块中,它的确认数就是1,之后每增长一个区块 则确认数加1。例如对于上图中的标注交易,当链增长到14#块时,该交易的 确认数就是3。

显然一个交易的确认数越多,意味着攻击者篡改交易的可能性越小。在比特币 中的应用当中,交易的接收者通常需要在六个确认之后,才可以将该笔 交易视为成功。

去中心化机制

与当前流通的任何法币都不同,比特币是去中心化的,没有一个中央机构 来管理比特币的发行与流通,因此比特币网络是一个典型的P2P网络,在每个 (全)节点上都有完整的区块链数据:

PHP程序员如何基于比特币开发各种相关功能

在这样的分布式计算环境下,如何保证新的交易在各个节点区块链中得以 一致的更新,就是经典的分布式一致性问题了 —— 每个节点都有可能提交 新的交易,而不同节点提交的交易也可能不相同,到底以哪个节点为准?

解决这种问题的经典方法就是(动态)选举一个决策者,其他节点复制 决策者的行为即可避免节点之间的不一致了。比特币的解决思路也一样, 不过它采用了一种类似于抢答的机制来动态选择胜出的节点,由胜出的 节点负责出块并打包交易 —— 所有节点都同时求解同一个问题,最先得到结果 的节点获胜并获得出块权利,其他节点则转而求解下一次出块的问题:

PHP程序员如何基于比特币开发各种相关功能

比特币给出的问题不可以通过解析方法求解,节点必须在所有的可能 结果中暴力尝试求解,由于胜出的节点可以获得比特币奖励,使得 节点旳动机和行为颇为类似于淘金的西部牛仔,因此这一求解过程被 称为挖矿/Mining

理论上每个节点都有获胜的概率,但显然,在同样的时间内,计算力强大的 节点会比其他节点尝试的机会更多,因此获胜的概率也越大 —— 在这种抢答机制下, 算力代替了智力,而这种依赖于暴力求解问题从而达成节点一致性的共识算法 被称为工作量证明/Proof Of Work

PHP程序员如何基于比特币开发各种相关功能

相关推荐