比特币技术分析

目录算法

 

 

背景介绍安全

相关的原理和设计网络

基本交易过程分布式

重要概念区块链

帐户/地址网站

交易编码

交易脚本 https://en.bitcoin.it/wiki/Script加密


 

背景介绍

比特币(BitCoin,BTC)是由中本聪在2009年提出基于区块链技术的一种数字货币实现;比特币网络是历史上首个通过大规模长时间检验的数字货币系统。根据中本聪的思路设计发布的开源软件以及建构其上的P2P网络。比特币是一种P2P形式的数字货币。点对点的传输意味着一个去中心化的支付系统。spa

第一个区块被称为创世区块或初始区块(Genesis Block)设计

兑换价格网站:https://www.blockchain.com/charts/market-price?timespan=all

历史上,在天然和人为因素的干预下,货币的形态经历了多个阶段的演化,包括实物货币、金属货币、代用货币、信用货币、电子货币、数字货币等。

 

当前货币存在的问题

“目前,不管是货币形式,仍是信用卡形式,都须要额外的支持机构(例如银行)来完成生产、分发、管理等操做。“中心化”的结构带来了管理和监管上的便利,但系统安全性方面存在很大挑战。诸如伪造、信用卡诈骗、盗刷、转帐等安全事件家常便饭。”

 

相关的原理和设计

比特币网络是一个分布式的点对点网络,网络中的矿工经过“挖矿”来完成对交易记录的记帐过程,维护网络的正常运行。

区块链网络提供一个公共可见的记帐本,该记帐本并不是记录每一个帐户的余额,而是用来记录发生过的交易的历史信息。该设计能够避免重放攻击,即某个合法交易被屡次从新发送形成攻击。

基本交易过程

 

比特币中没有帐户的概念。所以,每次发生交易,用户须要将交易记录写到比特币网络帐本中,等网络确认后便可认为交易完成。

除了挖矿得到奖励的 coinbase 交易只有输出,正常状况下每一个交易须要包括若干输入和输出,未经使用(引用)的交易的输出(Unspent Transaction Outputs,UTXO)能够被新的交易引用做为其合法的输入。被使用过的交易的输出(Spent Transaction Outputs,STXO),则没法被引用做为合法输入。[比特币的区块链帐本里记录的是一笔又一笔的交易]

所以,比特币网络中一笔合法的交易,必须是引用某些已存在交易的 UTXO(必须是属于付款方才能合法引用)做为新交易的输入,并生成新的 UTXO(将属于收款方)。

那么,在交易过程当中,付款方如何证实本身所引用的 UTXO 合法?比特币中经过“签名脚本”来实现,而且指定“输出脚本”来限制未来能使用新 UTXO 者只能为指定收款方。对每笔交易,付款方须要进行签名确认。而且,对每一笔交易来讲,总输入不能小于总输出。总输入相比总输出多余的部分称为交易费用(Transaction Fee),为生成包含该交易区块的矿工所得到。目前规定每笔交易的交易费用不能小于 0.0001 BTC,交易费用越高,越多矿工愿意包含该交易,也就越早被放到网络中。交易费用在奖励矿工的同时,也避免了网络受到大量攻击。

交易中金额的最小单位是“聪”,即一亿分之一(10^-8)比特币。

 

重要概念

帐户/地址

比特币采用了非对称的加密算法,用户本身保留私钥,对本身发出的交易进行签名确认,并公开公钥。

比特币的帐户地址其实就是用户公钥通过一系列 Hash(HASH160,或先进行 SHA256,而后进行 RIPEMD160)及编码运算后生成的 160 位(20 字节)的字符串。

通常地,也经常对帐户地址串进行 Base58Check 编码,并添加前导字节(代表支持哪一种脚本)和 4 字节校验字节,以提升可读性和准确性。

交易

交易是完成比特币功能的核心概念,一条交易可能包括以下信息:

  • 付款人地址:合法的地址,公钥通过 SHA256 和 RIPEMD160 两次 Hash,获得 160 位 Hash 串;
  • 付款人对交易的签字确认:确保交易内容不被篡改;
  • 付款人资金的来源交易 ID:从哪一个交易的输出做为本次交易的输入;
  • 交易的金额:多少钱,跟输入的差额为交易的服务费;
  • 收款人地址:合法的地址;
  • 时间戳:交易什么时候能生效。

网络中节点收到交易信息后,将进行以下检查:

  • 交易是否已经处理过;
  • 交易是否合法。包括地址是否合法、发起交易者是不是输入地址的合法拥有者、是不是 UTXO;
  • 交易的输入之和是否大于输出之和。

检查都经过,则将交易标记为合法的未确认交易,并在网络内进行广播。

交易脚本 https://en.bitcoin.it/wiki/Script

脚本(Script) 是保障交易完成(主要用于检验交易是否合法)的核心机制,当所依附的交易发生时被触发。经过脚本机制而非写死交易过程,比特币网络实现了必定的可扩展性。比特币脚本语言是一种非图灵完备的语言,相似 Forth 语言。

通常每一个交易都会包括两个脚本:负责输入的解锁脚本(scriptSig)和负责输出的锁定脚本(scriptPubKey)

输出脚本通常由付款方对交易设置锁定,用来对能动用这笔交易的输出(例如,要花费该交易的输出)的对象(收款方)进行权限控制,例如限制必须是某个公钥的拥有者才能花费这笔交易。

认领脚本则用来证实本身能够知足交易输出脚本的锁定条件,即对某个交易的输出(比特币)的拥有权。

输出脚本目前支持两种类型:

  • P2PKH:Pay-To-Public-Key-Hash,容许用户将比特币发送到一个或多个典型的比特币地址上(证实拥有该公钥),前导字节通常为 0x00; 
  • P2SH:Pay-To-Script-Hash,支付者建立一个输出脚本,里边包含另外一个脚本(认领脚本)的哈希,通常用于须要多人签名的场景,前导字节通常为 0x05;

区块

比特币区块链的一个区块不能超过 1 MB,将主要包括以下内容:

  • 区块大小:4 字节;
  • 区块头:80 字节:
  • 交易个数计数器:1~9 字节;
  • 全部交易的具体内容,可变长,匹配 Merkle 树叶子节点顺序。

其中,区块头信息十分重要,包括:

  • 版本号:4 字节;
  • 上一个区块头的 Hash 值:连接到上一个合法的块上,对其区块头进行两次 SHA256 操做,32 字节;
  • 本区块所包含的全部交易的 Merkle 树根的哈希值:两次 SHA256 操做,32 字节;
  • 时间戳:4 字节;
  • 难度指标:4 字节;
  • Nonce:4 字节,PoW 问题的答案。

可见,要对区块链的完整性进行检查,只须要检验各个区块头部信息便可,无需获取到具体的交易内容,这也是简单交易验证(Simple Payment Verification,SPV)的基本原理。另外,经过头部的连接,提供时序关系的同时加大了对区块中数据进行篡改的难度。

共识机制

传统共识问题每每是考虑在一个相对封闭的分布式系统中,容许同时存在正常节点、故障节点,如何快速达成一致。

对于比特币网络来讲,它是彻底开放的,可能面向各类攻击状况,同时基于 Internet 的网络质量只能保证“尽力而为”,致使问题更加复杂,传统的一致性算法在这种场景下难以实用。

所以,比特币网络不得不对共识的目标和过程都进行了一系列限制,提出了基于 Proof of Work(PoW)的共识机制。

首先是不实现面向最终确认的共识,而是基于几率、随时间逐步加强确认的共识。现有达成的结果在理论上均可能被推翻,只是攻击者要付出的代价随时间而指数级上升,被推翻的可能性随之指数级的降低。

此外,考虑到 Internet 的尺度,达成共识的时间相对比较长。按照区块(一组交易)来进行阶段性的确认(快照),提升网络总体的可用性。

最后,限制网络中共识的噪音。经过进行大量的 Hash 计算和少数的合法结果来限制合法提案的个数,进一步提升网络中共识的稳定性。

 

挖矿

基本原理

了解比特币,最应该知道的一个概念就是“挖矿”挖矿是参与维护比特币网络的节点,经过协助生成新区块来获取必定量新增的比特币的过程。

当用户向比特币网络中发布交易后,须要有人将交易进行确认,造成新的区块,串联到区块链中。在一个互相不信任的分布式系统中,该由谁来完成这件事情呢?比特币网络采用了“挖矿”的方式来解决这个问题。

目前,每 10 分钟左右生成一个不超过 1 MB 大小的区块(记录了这 10 分钟内发生的验证过的交易内容),串联到最长的链尾部,每一个区块的成功提交者能够获得系统 12.5 个比特币的奖励(该奖励做为区块内的第一个交易,必定区块数后才能使用),以及用户附加到交易上的支付服务费用。即使没有任何用户交易,矿工也能够自行产生合法的区块并得到奖励。

每一个区块的奖励最初是 50 个比特币,每隔 21 万个区块自动减半,即 4 年时间,最终比特币总量稳定在 2100 万个。所以,比特币是一种通缩的货币。
 

挖矿过程

挖矿的具体过程为:参与者综合上一个区块的 Hash 值,上一个区块生成以后的新的验证过的交易内容,再加上本身猜想的一个随机数 X,一块儿打包到一个候选新区块,让新区块的 Hash 值小于比特币网络中给定的一个数。这是一道面向全体矿工的“计算题”,这个数越小,计算出来就越难。

系统每隔两周(即通过 2016 个区块)会根据上一周期的挖矿时间来调整挖矿难度(经过调整限制数的大小),来调节生成区块的时间稳定在 10 分钟左右。为了不震荡,每次调整的最大幅度为 4 倍。历史上最快的出块时间小于 10s,最慢的出块时间超过 1 个小时。

为了挖到矿,参与处理区块的用户端每每须要付出大量的时间和计算力。算力通常以每秒进行多少次 Hash 计算为单位,记为 h/s。目前,比特币网络算力峰值已经达到了每秒数百亿亿次。

汇丰银行分析师 Anton Tonev 和 Davy Jose 曾表示,比特币区块链(经过挖矿)提供了一个局部的、迄今为止最优的解决方案:如何在分散的系统中验证信任。这就意味着,区块链本质上解决了传统依赖于第三方的问题,由于这个协议不仅知足了中心化机构追踪交易的需求,还使得陌生人之间产生信任。区块链的技术和安全的过程使得陌生人之间在没有被信任的第三方时产生信任。