跟我一起学习区块链技术 (5) - 重新认识一下你的比特币钱包

in #cn8 years ago

image1-1.png

提起比特币钱包, 除了昂贵的转账费用, 你有没有好奇过那一串天书地址是怎么产生的? 今天我来陪你一起扒一扒, 感兴趣的一起往下看. 由于这篇文章稍微有点硬核, 阅读过程中如出现不适, 你可以先把不明白的东西记下来, 然后继续向下看, 然后把不懂的东西丢向评论区, 我会尽量回复.

希望读完这篇文章能让大家有一些收获.

001.png

一句话概括一下你的钱包是怎么来的, 是通过你的私钥, 生成公钥, 再通过公钥, 生成一个比特币地址. 换句话说, 你的私钥决定了你的比特币地址.

私钥的产生

私钥其实是一个随机数字. 取值范围为在1到2的256次方. 从编程的⻆度来看, ⼀般是通过在⼀个密码学安全的随机源中取出⼀⻓串随机字节, 对其使⽤ SHA256 哈希算法进⾏运算, 这样就可以⽅便地产⽣⼀个256位的数字.

使用上一篇文章提到的 bitcoind 可以很方便的生成一个私钥.

bitcoind getnewaddress

返回的结果是这个私钥对应的公钥, 想取的私钥, 可以找到与这个公钥对应的私钥:

bitcoind dumpprivkey 1J7mdg5rbQyUHENYdx39WVWK7fsLpEoXZy

需要注意的是, 这并不是说从公钥可以计算出一个私钥, 而是去找与之对应的私钥. 从生成顺序来讲, 先生成私钥, 再生成与之对应的公钥, 不能反向.

我们来看返回的私钥:

KxFC1jmwwCoACiCAWZ3eXa96mBM6tb3TYzGmf6YwgdGWZgawvrtJ

很奇怪是不是, 不是说私钥是一个数字吗? 没错, 这个私钥是经过 Base58 校验和编码的, 这种经过校验编码的私钥, 我们称为 WIF (Wallet Import Format). 跳的有点远, 我们放到后面讲这个 Base58.

这里插一句, 私钥除了决定比特币地址, 在交易中, 还可以生成支付比特币所需的签名, 如果私钥发生泄露, 那么改私钥对应的比特币所有权也就一并失去了. 而且一般情况下, 私钥一定要备份好, 一个安全的系统不会为你保存私钥, 就像一个程序的系统不会明文存储的你的密码一样.

公钥的产生

通过椭圆曲线算法可以从私钥计算得到公钥, 和素数算法一样, 这是不可逆的. 一般公式表示为:

K = k * G

其中 K 为公钥, k 为私钥, G 为⽣成点的常数点. 这个反向运算非常之难, 几乎可以认为不可能. 目前已知唯一解法就是碰撞, 然后计算量之大, 以目前的算力, 可以认为无解, 具体请维基百科.

总之一句话, 通过私钥可以很容易的生成公钥, 公布公钥并不会被推算出私钥的值.

比特币地址

比特币地址是由公钥生成的, 具体生成过程如下图:

002.png

简单说, 就是将公钥通过 hash160 得到公钥的哈希值, 再将此哈希值进行 base58check 编码, 即得到比特币地址.

hash160 是指通过 RIPEMD160(SHA256(K)) 计算得到的 160 位哈希值, 是一个长度为 160 bit 的数字.

base58check 编码, 如果你熟悉 base64的话, 这个就好理解多了. Base64 使⽤了 26 个⼩写字⺟、 26 个⼤写字⺟、 10 个数字以及两个符号( 例如“+”和“/”). 而 Base58 是 Base64 编码格式的⼦集, 同样使⽤⼤⼩写字⺟和10个数字, 但舍弃了⼀些容易错读和在特定字体中容易混淆的字符, 如0( 数字0) 、 O( ⼤写字⺟o) 、 l( ⼩写字⺟L) 、 I( ⼤写字⺟i) , 以及“+”和“/”两个字符.

base58check 是⼀种常⽤在⽐特币中的Base58编码格式, 增加了错误校验码来检查数据在转录中出现的错误。 校验码⻓4个
字节, 添加到需要编码的数据之后。 校验码是从需要编码的数据的哈希值中得到的, 所以可以⽤来检测并避免转录和输⼊中
产⽣的错误。 使⽤Base58check编码格式时, 编码软件会计算原始数据的校验码并和结果数据中⾃带的校验码进⾏对⽐。 ⼆
者不匹配则表明有错误产⽣, 那么这个Base58Check格式的数据就是⽆效的。 例如, ⼀个错误⽐特币地址就不会被钱包认为
是有效的地址, 否则这种错误会造成资⾦的丢失.

这也是为什么很多转账系统可以检测你输入上去的比特币地址是否正确的原因.

base58check 的原理可以参考下图:

003.png

讨论到这里, 希望能对比特币地址的产生有一个这样的认识:

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

有关这些值生成的编程方法, 在 github 上有非常多的库, 比如这个 pybitcointools. 虽然从去年年底开始, 这个库不再维护, 但是之前的提交作者并没有删除, 可以 clone 下来读取前面的 commit, 加以利用.

比特币钱包

比特币钱包其实就是私钥的容器. 可以通过一些方法产生和管理你的私钥(们).

需要注意的是, ⽐特币钱包只包含私钥⽽不是⽐特币. 每⼀个⽤⼾有⼀个包含一个或多个私钥的钱包. 钱包中包含成对的私钥和公钥. ⽤⼾⽤这些私钥来签名交易, 从⽽证明它们拥有交易的输出. ⽐特币是以交易输出的形式来储存在区块链中. 简单点说, 你的钱包里显示的比特币值, 其实是你钱包里的私钥对应在区块链上所有交易计算出来的值, 这些值是在区块链上的, 并不是在一个钱包里.

比特币钱包根据创建私钥的方法不同, 可以分为非确定性钱包, 确定性钱包, 助记码钱包, 分层确定性钱包几种. 目前我是用的钱包里, 居多的是助记码钱包. 这些创建私钥的方法一般会在 BIP 中进行描述, 比如助记码就是在 BIP0039 中定义的.

根据钱包的形式, 还查到了一些蛮有趣的比特币钱包, 比如比特币靓号地址(1LoveBPzzD72PUXLzCkYAtGFYmK5vYNR33), 纸钱包(比如 @tumutanzi 给同事的圣诞礼物)等.

最后

后面可能会讲讲交易和我最近的一些投资. 不得不说区块链这个概念在国内被炒热之后, 闭着眼睛都能赚钱, 技术流对抗基本面在市场情绪偏疯狂的基调下, 作用有限, 不过还是可以研究研究, 梳理一下心得. 具体放到后面再说吧.

Sort:  

这个地址真的很靓!

Coin Marketplace

STEEM 0.04
TRX 0.32
JST 0.082
BTC 60785.45
ETH 1557.47
USDT 1.00
SBD 0.47