查看原文
其他

Blocksatck Dev 分享 | BTC 钱包技术都在这里了

奶哥 一块Plus社区 2020-11-11

一块链习是首家区块链技术学习社区,提供最系统的区块链技术课程学习,定期出品有深度的技术观察 + 评论。


《 Blockstack:从开发入门到技术实战》课程训练营是由一块链习和 Blockstack 共同打造的全球第一档·Blockstack开发中文实战课程。


每周日晚8点,作为课程内容知识拓展——助教技术分享会,由各位第一期的助教们自发轮流在线上进行分享,为学员们详细解读一个 Blockstack 技术相关内容。


 

昨晚,由Autodesk软件开发工程师——奶哥助教在直播间为大家带来第一讲「比特币钱包技术与Blockstack账户体系简介」,内容复盘如下。

 


.01 账号:公私钥对


举个例子,在中心化的体系中,比如,微信,账号是存储在腾讯服务器中的一行数据。


这行数据包括了你的帐号名和密码,密码由你自行进行设置,如果密码遗忘之后,可以先通过其他认证手段,向腾讯来证明你是账号的所有者,然后申请更换密码。


你虽然看上去是账号的所有者,但是事实上,你的帐号还是腾讯分配保管的,且腾讯有权,将你的帐号封禁。


更可怕的是,如果腾讯的帐号体系被人攻破,那你的帐号和其对应的数据都会有可能被其他人所获取。


那么在去中心化的体系中,账号是什么呢。简单来说,去中心的帐号体系是建立在非对称加密算法基础上,随机生成的一组公私钥对。


例如在bitcion的场景下,你见的最多的就是地址,就是通过私钥推导出公钥,然后再用公钥推导出地址。发送到该地址下btc,可以通过对应的私钥,进行解锁交易。


可以看出去中心化帐号体系中的核心就是私钥,可以说私钥是万物之源,只要把私钥保护好,基于当前计算机的能力,你的帐号是几乎无法被攻破的。但弊端是,如果你把私钥弄丢了,对应地址上的锁住的btc就永久丢失了。

             

私钥是如何生成的呢,一般来说,是由硬件级别的随机数作为种子,通过算法生成出来的。大家可以去这个网站(https://www.bitaddress.org/)上体验一下,它会通过你鼠标的移动轨迹作为种子,生成对应的地址和私钥。


这里最最重要的就是随机数种子和算法,千万不要用很简单的。随机数或者很简单的算法,这样都很容易带来泄密的风险。



.02  钱包客户端保管私钥


那么对于一般用户来说是如何生成并保管私钥的呢。答案是钱包客户端。


在非常早期的时候,用户是需要备份含有私钥的钱包文件,小心翼翼地把钱包文件copy到U盘里,然后把U盘锁在保险柜呢。


随着钱包的发展,一个钱包内,开始支持多个私钥(type-0)。因为根据加密货币的最佳实践,一个地址只使用一次是最为稳妥的方式,发生交易后,使用新地址存储找零。


那如何在一个钱包里管理多个私钥呢。最简单的方式是预先生成出一组毫无关联的地址池,然后用的时候,从地址池拿一个没用过的,发现快不够用了,再生成出更多的地址。


这种钱包有一个不太优雅的名字JBOK(Just a Bunch Of Keys)钱包。钱包会管理所有的私钥,并把该私钥池锁定的所有余额加起来,算作该钱包的余额。但是因为要动态增加地址,而且每个地址之间并无关联,所以需要经常备份钱包文件。

             

正如他的名字一样JBOK钱包,并不优雅。那么在其基础上马上发展出了种子钱包,即通过一个种子生产出一组相关联的地址(type-1)。发展到这步,用户在备份时,只需要备份种子,就可以通过种子恢复出所有的私钥,已经初具现代钱包的样子。

             

在此基础上,BIP32标准孕育而生,BIP32通过seed生成的是一棵私钥树。树状结构的私钥带来了两个好处,


第一,可以更好的做功能上分组,比如可以规定某棵树上的地址专门用作收

帐,另外一棵的地址用作找零。


第二,安全性有所提升,可以在不接触到私钥的情况下,独立通过算法直接生成地址。例如在web浏览器中,你可以为你的每一个订单独生成成一个地址,而完全不需要暴露任何私钥信息。

             

由于seed的格式对人来说还是过于复杂,BIP39标准又被提出。在BIP39标准下,助记码用更为人性化的方式替代了seed,通过助记码可以还原出seed,这就是我们经常看到需要我们备份的单词组。下面两张图演示了


1.通过随机数生成出助记码:

             

2.助记码又如何生成出seed,注意这里还有一个可选的密码口令,这个密码口令使得仅有助记词是不够的,避免了助记词备份被盗取后利用。


但如果开启了密码口令,那么你必须在恢复账户时,也输入这个密码口令,和助记码缺一不可。你一旦遗忘这个密码口令,那也就丢失了这个账户。

             

BIP32所生成的私钥树,是不是能给每一层赋予意义呢,是不是可以一套seed/助记词,可以用在不同的币种上呢。


于是我们有了BIP44。BIP-44指定了包含5级预定义树的结构

m / purpose’ / coin_type’ / account’ / change / address_index


第一层的purpose总是被设定为44’。


第二层的“coin_type”特指币种,允许多币种HD钱包中的每一种数字货币在第二层级下都有自己的子树。例如:Bitcoin 是 m/44’/0’、Bitcoin Testnet  是 m/44’/1’,Litecoin 是 m/44’/2’。


第三层级是“account”,允许用户为了会计或者组织目的,再细分钱包到独立的逻辑性子账户。举个例子,一个HD钱包可能包含两个⽐特币“账户”:m/44’/0’/0’ 和 m/44’/0’/1’。每个账户都是它自己子树的根。


第四层级就是“change”。每一个HD钱包有两个子树,一个是接收地址,另一个用来创造找零地址。


可用的地址由HD钱包派生为第四层级的子级,就是第五层级“address_index”。比如,比特币主账户的第三个收款地址就是 M/44’/0’/0’/0/2。


关于btc的账户体系就讲到这里了。推荐大家可以去这个网页玩一玩BIP39 - Mnemonic  Code。



.03 Blockstack的帐号体系


确切地说,Blockstack不应该叫账号体系,他们官网更倾向于叫身份体系。每一个 Blockstack  ID 都是一个去中心化的身份,而每个身份都有其私有的数据存储中心(gaia),在使用Blockstack体系内的DAPP时,都需要进行身份的验证,才能访问到其存储中心中的加密数据。


Blockstack的身份体系的设计参考了DNS,大体可以分为顶级域名(id),二级域名(naige.id),和三级域名(__naige.id.blockstack)。


通常,在Blockstack中注册的第一个身份,都是在id.blockstack域名下三级域名,因为当前只有id.blockstack域名下申请的身份才是免费的。


在这次注册之后,Blockstack会生成出bitcoin的充值地址,因为在Blockstack生态中,所有的费用几乎都可以通过bitcoin进行支付。

             

如果你需要一个二级域名,那么你需要缴纳了租用费用后,才能在一段时期(二年)内拥有这个二级域名,如果到期之后,你还需要续费才能继续使用。


在二级域名上,可以新建三级域名,但是需要二级域名的所有者做一些技术搭建的工作,因为三级域名的解析过程,并不是实时上链,而是需要通过二级域名的所有者定期上报到链上。

        

那么如何备份身份呢。其实Blockstack的身份体系是遵循BIP44协议的。其币种编码是5757,slips/slip-0044.md at master · satoshilabs/slips · GitHub,大家可以在这里查看到BIP44的币种列表。


既然遵循BIP44,那也一样是可以通过助记词进行备份。推荐大家,按照规范抄写好对应的12个助记词,顺序也一定要正确。

              

对了,还有一个小细节,如果大家在恢复时,发现自己的其他身份不见了话,那只需要在页面上继续新添身份就可以找回了。这是因为一套助记词,可以生成出许多个身份,Blockstack默认只从第一个开始找回。


例如:你的主身份其实是第三个的话,Blockstack默认找回的第一个是 M/5757’/0’/0’/0/0 ,只有你添加到 M/5757’/0’/0’/0/2 时,系统才会发现这个身份私钥,及其对应的ID。




更多阅读:

| Blockstack 中国负责人 Gavin:通过 DID 标准解决数据孤岛及隐私安全问题

| 一文了解 Web3.0 DID 发展现状

| 后天开课| Blockstack开发课第一期部分入围学员名单!


扫码关注公众号,回复“1”加入开发者社群


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存