白话区块链 之 10 - 什么是比特币钱包、钱包地址?什么是私钥、公钥?

【编者Peter Ye按】


比特币的地址其实就是通过公钥转化而来的:

私钥 -> 公钥 -> 公钥哈希 -> 比特币地址


可以打开如下链接,详细阅读本系列的前几篇:

白话区块链 之1: 为什么账本要这么记?

白话区块链 之2: 区块链技术理念

白话区块链 之3: 区块链技术栈

白话区块链 之4: 区块链分类与架构

白话区块链 之5 - 创世元灵:一切源自比特币

白话区块链 之7 - Bitcoin Core之客户端逻辑结构

白话区块链 之8 - 比特币的发行:挖矿

白话区块链 之9 - 比特币下载区块数据时,如何校验是否有问题呢?


下面的段落对应《白话区块链》的第1章的1.4.5节,原文标题为《比特币钱包核心钱包与轻钱包》


白话区块链 之 10 - 什么是比特币钱包、钱包地址?什么是私钥、公钥?


比特币钱包核心钱包与轻钱包


钱包,是属于比特币系统中的一个前端工具,其最基本的功能就是用来管理用户的比特币地址、发起转账交易、查看交易记录等,在这方面与我们生活中使用的钱包是类似的,一开始的比特币钱包是跟比特币核心客户端一起发布的,在1.1.2节中我们介绍比特币核心客户端的时候已经初步做了个了解,这个钱包是比特币核心钱包,其使用过程必须要配合完整的区块链数据副本,因此一般也只适合在桌面端使用。


我们在使用比特币钱包的时候,经常会遇到一个名词:比特币地址。通过钱包转账就是将比特币从一个地址转移到另外一个地址,暂且不论这个转移的过程是什么样的,就这个地址到底是什么意思呢?它又是通过什么来产生的呢?我们先来看一组名词关键字:私钥、公钥和钱包地址。


私钥与公钥是什么意思呢?这是来自于公开**算法的概念,我们常说比特币是一种加密数字货币,之所以这么说,是因为比特币的系统设计中巧妙地使用了现代加密算法,而其中一个运用就是生成比特币地址,比特币地址的生成与公开**算法密切相关,什么叫公开**算法呢?


传统的加密算法,其加密和解密方法是对称的,比如凯撒密码,通过将字母移位来加密,比如字母a替换成cb替换成dd替换成f这样,本来是abc的单词就变成了cdf,然而这种加密算法一旦泄露,别人也就知道了解密算法,换句话说只有一个**。针对这种问题,公开**算法就应运而生,公开**算法是属于一种不对称加密算法,拥有两个**,一个是私钥,一个是公钥,公钥可以公开给别人看到,私钥必须要妥善保存,使用私钥加密(通常习惯上将私钥加密称之为是私钥签名)的数据可以用公钥解密,而使用公钥加密的数据可以用私钥解密,两者是互相匹配的。目前使用比较广泛的公开**算法主要有RSA算法和椭圆曲线加密算法(ECC),RSA是利用了素数分解难度的原理ECC是利用了椭圆曲线离散对数的计算难度,比特币中使用的是椭圆曲线加密算法


接下来,我们就来看下比特币地址是怎么生成的,为了直观展示,我们看一幅示意图:

白话区块链 之 10 - 什么是比特币钱包、钱包地址?什么是私钥、公钥?



这便是比特币地址的生成过程,过程大致是这样的:

1)首先使用随机数发生器生成一个私钥,私钥在比特币中的作用非常重要,可以用来证明用户的身份,也可以签发交易事务。

2)私钥经过SECP256K1算法处理生成了公钥,SECP256K1是一种特定的椭圆曲线算法,需要注意的是,通过算法可以从私钥生成公钥,但是却无法反向的从公钥生成私钥,这也是公钥为什么可以公开的原因。

3)公钥接下来先使用SHA256哈希算法计算,再使用RIPEMD160哈希算法计算,计算出公钥哈希,比特币的代码中通过两次哈希来计算地址值,这样能进一步确保哈希后数值的唯一性,进一步降低不同的数据进行哈希后出现相同的概率。与SHA256一样,RIPEMD160也是一种Hash算法。

4)将一个地址版本号连接到公钥哈希(比特币主网版本号为“0x00”),然后对其进行两次SHA256运算,将计算得到的结果取前面4字节作为公钥哈希的校验值。

5)将0x00版本号与公钥哈希以及校验值连接起来,然后进行BASE58编码转换,最终得到了比特币地址。


以上便是比特币地址的生成过程了,我们可以发现比特币的地址其实就是通过公钥转化而来的,将上图简化一下,就是下面这么一个过程:

白话区块链 之 10 - 什么是比特币钱包、钱包地址?什么是私钥、公钥?

所以,实际上,在比特币系统中,本质上并没有一个叫做地址的东西,因为地址是可以通过公钥转化而来的,可以理解为就是公钥的另外一种形式,而公钥又是可以通过私钥计算出来的,因此在比特币钱包中,真正需要妥善保存的是生成的私钥数据,这玩意可千万不能弄丢了,一旦丢失,那可比忘记银行卡密码还麻烦。比特币钱包的主要功能就是保管私钥


比特币的核心钱包是跟核心客户端在一起的,可以完成创建钱包地址、收发比特币、加密钱包、备份钱包等功能,由于核心钱包是与核心客户端在一起使用的,因此在进行转账交易时,可以进行完整的交易验证,当然付出的代价就是必须得带上那么一大坨的账本数据,到20178月份这份数据已经超过了130G,而且还在持续不断的增长中(【Peter Ye备注:2018年8月,比特币全部账本数据达到203GB】),因此并不方便用户的实际使用,实际上除了这一点不方便外,在私钥管理上也有麻烦的地方,通过官方的核心钱包可以无限制的创建自己所需数量的钱包地址,然而这些地址对应的私钥管理也就成了问题,如果不小心损坏了某一个私钥数据,那也就找不回来了,基于这些问题,发展出了新的解决方案。


很多时候,我们在进行支付的时候,只是想通过一个支付验证,知道支付已经成功发起就可以了,对于完整的交易验证(需要在完整的账本数据上校验,比如是否包含足够的余额,是否双花等等)可以交给核心节点,这样就可以将钱包功能部分剥离出来,由此产生了SPVSimplified Payment Verification , 简单支付验证)钱包,事实上这个概念在比特币白皮书中就介绍过了,我们来看下它的原理是什么,SPV钱包的大致过程如下所示。


1)    首先下载完整的区块头数据,注意是区块头不是所有的区块链数据,这样可以大大减少需要获取的账本数据量,区块头中包含有区块的梅克尔根,SPV方式主要就是靠它来实现的

2)    如果是想要验证某笔支付交易,则计算出这笔交易事务的哈希值txHash

3)    找到txHash所在的区块,验证一下所在区块的区块头是否包含在账本数据中。

4)    获得所在区块中计算梅克尔根所需要的哈希值。

5)    计算出梅克尔根。

6)    若计算结果与所在区块的梅克尔根相等,则支付交易是存在的。

7)    根据该区块所处的高度位置,还可以确定该交易得到了多少个确认


我们看到了,SPV原理的钱包就是使用了梅克尔树来验证支付是否已经发生,这也是为什么称之为是简单支付验证的原因,不过我们也可以发现,支付验证所做的事情很少,仅仅只能看到当前的支付交易是否被发起而已,并不能保证这笔交易事务最终会进入到主链中,也就是说还需要等待核心节点进行全面的交易验证并且矿工打包到区块后进入主链,在这个过程中是有可能发生失败的,所以SPV钱包虽然是带来了便捷性但也是牺牲了安全性的。


时至今日,已经出现了各种各样的比特币钱包,在bitcoin.org网站上我们可以一见端倪:

我们可以看到有各种类型的钱包可以使用,通常我们把不需要携带完整账本数据使用的钱包称之为是轻量级钱包,大家在选用自己的钱包时,务必了解清楚钱包的功能和来源,以免遭受不必要的损失。


接下来我们再来介绍一种管理多个私钥的钱包技术,称之为是分层确定性钱包,术语是Hierarchical Deterministic Wallets,有时也简称为HD Wallets,这个是在比特币开发的BIP32中专门的建议论述(BIP全称为Bitcoin Improvement Proposal,是比特币改进建议的意思,这是一个面向比特币社区的一个公开的意见簿,BIP32就是第32号建议的意思)。 简单的说,分层确定性钱包是具有如下的特点:


1)用一个随机数来生成根私钥,这部分和任何一个比特币钱包生成任何一个私钥没有区别;

2)用一个确定的,不可逆的算法,基于根私钥生成任意数量的子私钥。


比如比特币中使用的SHA256就是一个确定不可逆的算法,可以很容易的使用SHA256设计出一个HD模型:SHA256seed+n,这个就算是类型1确定性钱包了。实际上,分层确定性钱包是确定性钱包的一种,目前分层确定性钱包有Type1Type2,还有BIP32规范几种类型,这些都是为了实现这同一个目的而制定的不同实现方法,基本原理都是类似的。

所谓的分层,除了私钥有主私钥来生成逐层的私钥以外,公钥也一样,通过主公钥生成所有的子公钥,实际上,生成的**本身,无论是私钥还是公钥,都还可以作为根来继续生成子**,这就是所谓的分层了。注意这里的通过公钥生成子公钥,不需要私钥的参与,无论是主私钥还是子私钥都不需要参与。我们来看一下图示,如下:

白话区块链 之 10 - 什么是比特币钱包、钱包地址?什么是私钥、公钥?


白话区块链 之 10 - 什么是比特币钱包、钱包地址?什么是私钥、公钥?


如图所示,通过主私钥和主公钥,可以按规律生成一棵**树。


这个特性是非常有用的,在一定程度上,隔离了私钥和公钥,可以带来不少的便捷性,如下。

1备份只需要备份主私钥就行了,新增地址无需再次备份私钥

2)可以保证主私钥的冷存储,无论增加多少个地址,只需要主公钥就可以了。

3)方便审计,只需要提供主公钥或者某个分支的子公钥,就可以查看下级的数据而又保证不能被交易。

4)有了这棵树,还可以配合权限,设定不同层级的权限,能查看余额还是能交易等。当然啦,便捷性往往都是要牺牲安全性的,缺点很明显,这种钱包,由于私钥之间是具有固定关系的,不那么随机了,因此只要暴露任何一个其中的私钥,再加上主公钥做关联分析,就很有可能使整个树状**结构都泄露


---End---


未完待续……,欢迎持续关注微信公众号“乐生活与爱IT” 。


在这个公众号平台上,之前也分享过和区块链相关的如下文章:


Gartner:2018年十大战略科技发展趋势

雄文:知耻而后勇,数字代币和区块链技术的未来 (修改版-20180213)

谁将会是AWS的颠覆者? (完整版)

比特币到底是货币资产,还是骗局?

比特币能成为人类未来的货币吗?

赠书 | 金融区块链的挑战

当软件定义存储(SDS)遇见区块链(BlockChain)

掘未来,容天下 - 九存区块链战略及产品发布会摘要

钱要花在刀刃上 & 兼聊存储发展的最近十二年

诺贝尔物理奖候选人张首晟:区块链技术是互联网世界新的分合转折点

当SDS遇见BlockChain 之二:区块链存储为什么势在必行?(SDS的新赛道 - 暗流涌动的区块链存储)


白话区块链 之1: 为什么账本要这么记?

白话区块链 之2: 区块链技术理念

白话区块链 之3: 区块链技术栈

白话区块链 之4: 区块链分类与架构

白话区块链 之5 - 创世元灵:一切源自比特币

白话区块链 之7 - Bitcoin Core之客户端逻辑结构

白话区块链 之8 - 比特币的发行:挖矿

白话区块链 之9 - 比特币下载区块数据时,如何校验是否有问题呢?


---


微信公众号平台"乐生活与爱IT"在目前阶段,主要是分享区块链(BlockChain)

、软件定义存储(SDS)和超融合架构(HCI)相关的文章,偶尔也会分享虚拟化、云计算、大数据、人工智能、IoT等IT类文章,甚至生活类的好文章。欢迎投稿,特别是原创文章。如果原创文章属于首次发布,根据质量和阅读量的不同,能获得20~500元的稿费。我的QQ号:9269216另外,如果还有赞赏收入,作者可获得60%


欢迎对SDS感兴趣的朋友,加入软件定义存储讨论 QQ群:122295009,可下载原创的一些文章,及其他有参考价值的文档。可直接搜索群号,或者扫描如下二维码:

白话区块链 之 10 - 什么是比特币钱包、钱包地址?什么是私钥、公钥?


欢迎您通过扫描关注微信公众号:“乐生活与爱IT”。

白话区块链 之 10 - 什么是比特币钱包、钱包地址?什么是私钥、公钥?

关注后,可以通过点击左下角的文章目录,通过输入三位数(记住!是三位数,目前第一位是0或者1)详细了解如何查看历史文章。


对软件定义存储与区块链感兴趣的朋友,可以添加如下管理员:

xiaoganggang10101

eric0424

liushuan2008

sdg8848

dts0103


加入到微信群“当SDS遇见BlockChain"。希望大家一起学习和讨论,共同进步。添加时,请自我介绍姓名、公司名、所在城市等信息。


点击左下角“读原文”,可以跳转到《当SDS遇见BlockChain 之二:区块链存储为什么势在必行?(SDS的新赛道 - 暗流涌动的区块链存储)