精通比特币
作者:Andreas M Antonopoulos
Andreas M. Antonopoulos 是一位著名的技术专家和连续创业企业家,比特币界最著名和倍受尊敬的⼈人物之一。著名的的公共演说家、教师和作家,他善于把复杂的问题变得简单和易于理解。
封面故事
1、群落中的每一只蚂蚁个体仅仅遵循一些社会互动和化学气味交换的简单规则就变现出了高度复杂行为,形成了地球上仅次于人类的最为庞大且复杂的动物社会。
2、蚁群里不存在中央集权体制或领导人,大自然向我们证明去中心化体制具有弹性并且能创造出意想不到的复杂性和难以想象的精妙。
3、比特币就是这样一个高度复杂的去中心化的可信网络,真正意义上的世界银行。
术语解释
BIP
比特币改进协议(Bitcoin Improvement proposals 的缩写),指比特币社区成员所提交的一系列改进比特币的提议。
第一章 介绍
1.1 什么是比特币?
比特币是由一系列概念和技术作为基础构建的数字货币生态系统。狭义的“比特币”代表系统中的货币单位,用于存储和传输价值。是一个通过分布式计算来传播价值和保障数字资产所有权的网络。
比特币可以做传统货币能做的所有事,在一定意义上,比特币才是互联网货币的完美形态,具有快捷、安全、无国界的特性。
比特币隐含在收发币的转账记录中。用户只要有证明其控制权的密钥,用密钥解锁,就可以发送比特币,拥有密钥是使用比特币的唯一条件,控制权完全掌握在每个人说中。(这可能是人类历史上第一次通过数学的方式保护私有财产不可侵犯)
比特币是一个分布式的点对点(peer to peer)网络系统。没有中央服务器,也没有中央发行机构。是通过“挖矿”产生的,挖矿就是验证比特币交易的同时参与竞争来解决一个数学问题。任何一个节点都可以参与做矿工。平均每10分钟就有人能验证过去10分钟发生的交易,获得新币作为工作回报。本质上,挖矿把央行的货币发行和结算功能进行分布式,用全球化的算力来取代了中央发行机构。
比特币系统包含调节挖矿难度的协议,保证挖矿的难度是动态调整的,不管多少矿工参与挖矿,平均10分钟只有一个成功。并且,每四年开采量减半,最终总量为2100万。预计在2140年达到上限。
比特币代表了数十年的密码学和分布式系统的巅峰之作,这是一个独特而强大的组合,汇集了四个关键的创新点。
比特币由这些构成:
▷ 一个去中心化的点对点网络(比特币协议)
▷ 一个公共的交易账簿(区块链)
▷ 一个去中心化的数学的和确定性的货币发行(分布式挖矿)
▷ 一个去中心化的交易验证系统(交易脚本)
1.2 比特币的产生
2008年,中本聪发表一篇《比特币:一个点对点的电子现金系统》论文,宣告比特币产生。从此,人类进入一个新的世界。
1.3 入门
三种比特币客户端
完整客户端(全节点)包含比特币交易的整个历史,类似于一个独立的email服务器。
轻量级客户端
在线客户端
第二章 比特币的原理
在本章中,我们将通过追踪在网络上传输的一笔交易,从整个比特币系统的的视⻆检视各个部分之间的交互。
2.1 比特币交易
Alice 用比特币支付买了一杯咖啡,咖啡店老板Bob收到比特币。
每一笔交易包含一个或多个输入,输入是针对一个比特币账号的负债。同时,有一个或多个输出,被当成信用点计入到比特币账户中。
2.2 常见的交易形式:
一般交易:一个输入和两个输出
从一个地址到另一个地址的简单支付,一般是一个输入和两个输出(包含找零)
集合型交易:多个输入,一个输出
一般由钱包应用产生来清理许多在支付过程中的小数额的找零。
分散型交易:一个输出,多个输出
商业实体用作分配资金,例如给多个雇员发工资。
2.3 交易的构建
钱包知道如何选取合适的输入和输出以建立交易。我们只需要指定目标地址和金额,其他操作钱包会在后台自动完成,甚至可以在完全离线的情况下建立交易。只有在执行交易的时候才需要将交易发送到网络。
交易的输出会被创建成为一个包含这笔数额的脚本的形式,只能被引入这个脚本的一个解答后才能兑换。简单点说就是,Alice的交易输出会包含⼀个脚本,这个脚本说 “这个输出谁能拿出一个签名和Bob的公开地址匹配上,就支付给谁”。因此,Alice会用Bob 的签名来包装一个输出。
第二个输出就是找零,给自己的输出。
交易的大小是如何测算的?
这个交易包含处理所需的所有信息,钱包将新的交易给任意一个已连接到互联网的比特币客户端,节点就会立刻将它转发给连接到自身的其他节点、迅速传播,几秒钟就能到达大多数节点。
这个交易在比特币网络上传播开来,但必须要经过挖矿验证且加到一个区块之中,这个交易才会成为区块链的一部分。该系统的信任是建立在计算的基础上的。交易被抱在一起放进区块需要极大的计算量来证明,但是只需要少量计算就能验证它们已被i证明。(一个很棒的类比就是 多人数独游戏,做出来很难,判断做对了没有却很简单,我很喜欢这个类比)
挖矿有两个作用:(1)发行货币,每个区块创造的区块是固定的,慢慢减少。
(2)结算系统,创建信任。区块越多,花费的计算量越大,以为着更多的信任。
挖矿做的计算称为工作量证明,指的是用SHA256加密算法不断对区块头和一个随机数字进行哈希计算,直到出现一个和预设值相匹配的解。第一个找到这个解的矿工会赢得这局竞赛并将这个区块发布到区块链上。
新的交易被加入新区快时,以交易费高的优先以及其他的一些规则进行排序。新的一轮竞争开始的时候,会立刻将一些交易和这个新区快的数字指纹放在一起开始构建一个新区块,并开始给它计算工作量证明。每个矿工会在他的区块包含一个特殊的交易,自己挖矿所得的12.5个到自己的地址里。
第四章 密钥、地址、钱包
4.1 简介
比特币的所有权通过数字密钥、比特币地址和数字签名来确定。数字密钥放在桥暴利,独立于比特币协议,无需区块链和网络连接。在交易环节,收件人的公钥是通过数字指纹表示的,称为比特币地址(一般用公钥生成并对应于这个公钥,脚本也可以表示地址)
4.1.1 公钥加密和加密货币
在比特币系统中,我们⽤公钥加密创建一个密钥对,用于控制比特币的获取。密钥对包括一个私钥,和由其衍生出的唯一的公钥。公钥用于接收⽐特币,而私钥用于比特币支付时的交易签名。
公钥和私钥之间的数学关系,使得私钥可用于生成特定消息的签名。此签名可以在不泄露私钥的同时对公钥进行验证。
私钥
本质上就是一个随机选择的数字。是比特币的控制权和所有权凭证。所以,必须要注意备份,保持机密。
如何生成私钥:找到足够的熵源,即随机性来源。可以是1和n-1之间的任何数字,其中n是一个常数(n=1.158*10的77次方),并由比特币所使用的椭圆曲线的阶所定义。
在编程的角度来看,一般是通过一个密码学安全的随机源中取出一长串随机字节,对其进行SHA256哈希算法进行计算。这样就产生了一位256位的数字。如果运算结果小于n-1,就可以了,如果不行再来一次。
公钥
通过椭圆算法可以从私钥计算得到公钥,不可逆的过程
K = k * G
其中 k 是私钥, G 是被称为生成点的常数点, K 是所得公钥。
而反向运算,即给定公钥k 求私钥K的过程称为“寻找离散对数”,非常困难,只能用穷尽的办法暴力搜索。
椭圆曲线密码学解释
椭圆曲线加密法是一种基于离散对数问题的非对称(或公钥)加密法,可以用对椭圆曲线上的点进行加法或乘法运算来表达。
椭圆曲线上的点的加法或减法。给定椭圆曲线上的两个点P1和P2,则椭圆曲线必定有第三点 P3 = P1 + P2。几何图形中,该第三点P3可以在P1和P2之间画⼀条线来确定。这条直线恰好与椭圆曲线上的一点相交。此点记为 P3'=(x,y)。然后,在x轴做映射获得 P3=(x,-y)。
至此,我们已经定义了椭圆加法,为扩展加法下⾯我们对乘法进⾏标准定义。给定椭圆曲线上的点P,如果k是整数,则 kP =P + P + P + …+ P(k次)。注意,k被有时被混淆而称为“指数”。
如何生成公钥
以一个随机生成的私钥k为起点,我们将其与曲线上已定义的 ⽣成点G相乘以获得曲线上的另一点,也就是相应的公钥K。生成点是secp256k1标准的一部分,比特币密钥的生成点都是相同的:
{K = k * G}
其中k是私钥,G是⽣成点,在该曲线上所得的点K是公钥。
因为所有比特币用户的生成点是相同的,一个私钥k乘以G将得到相同的公钥K。k和K之间的关系是固定的,但只能单向运算,即从k得到K。这就是可以把比特币地址(K的衍生)与任何人共享而不会泄露私钥(k)的原因。
比特币地址
比特币地址是由一个数字和字母组成的字符串,可以与任何想给你比特币的人分享。由公钥生成的比特币地址以数字“1”开头。
比特币地址可以由公钥经过单向的加密哈希算法得到,哈希算法是一种单向函数,接受任意长度的输入产生指纹摘要。由公钥生成比特币地址时使用的算法是Secure Hash Algorithm (SHA)和the RACE Integrity Primitives Evaluation Message Digest (RIPEMD),特别是SHA256和RIPEMD160。
A = RIPEMD160(SHA256(K))
其中 K 为公钥,A 为比特币地址
通常见到的地址是经过Base58Check 编码的,这种编码使用了58个字符和校验码,提高了可读性、避免歧义并有效防止了在地址转录和输入中产生的错误。简而言之,Base58就是由不包括(0,O,l,I)的大小写字母和数字组成。Base58Check是一种常用在比特币中的Base58编码格式,增加了错误校验码来检查数据在转录中出现的错误。校验码长4个字节,添加到需要编码的数据之后。校验码是从需要编码的数据的哈希值中得到的,所以可以用来检测并避免转录和输入中产生的错误。
密钥的格式
公钥和私钥的都可以有多种编码格式。一个密钥被不同的格式编码后,虽然结果看起来可能不同,但是密钥所编码数字并没有改变。这些不同的编码格式主要是用来方便人们无误地使用和识别密钥。
公钥的格式:分为非压缩和压缩格式两种。前缀04是用来区分非压缩格式公钥,压缩格式公钥是以02或者03开头。引入压缩格式公钥是为了减少比特币交易的字节数,节省空间。
压缩式公钥渐渐成为了各种不同的比特币客户端的默认格式,大大减少交易所需的字节数,也让区块链所需的磁盘空间变小。
比特币钱包
钱包是私钥的容器,通常通过有序文件或者简单的数据库实现。