比特币扩展秘钥

分层确定性钱包

平常我们使用钱包时,每个账户都要导入一个私钥,当我们需要很多账户时,管理众多的私钥就成了一个问题,分层确定性钱包就是为了解决这个问题,乍一看这个原理好像很简单,使用一个随机数生成私钥和一个编码,然后所有的子秘钥都可以用这两个衍生出来。这里的编码作为一个salt值,只有同时获得密钥和编码,我们才能进行下一层的衍生。密钥和编码就组成了所谓的扩展密钥,使用扩展密钥就可以衍生子秘钥。下面是扩展私钥的生成方法:

zhongzi

pub

扩展公钥

上面这两张图还很好理解,扩展密钥还有一个特性,就是有扩展私钥,还有扩展公钥,只要有父公钥和编码,就可以直接衍生出子公钥,这里一开始不太理解,为什么在没有子私钥的情况下就能直接获得子公钥?

pri

对比一下私钥和公钥的生成方式,子私钥是用父私钥,父公钥,父链编码,索引号算出来的,子公钥是用父公钥,父链编码,索引号算出来的。去翻了一下BIP0032的文档才弄明白,下面是具体的算法

prih
先简单介绍一下secp256k1椭圆函数加密算法,就是一个公式K=k*G,这里的G是二维坐标的一个点(x,y),公式里的k就是私钥,是一个数字,K就是公钥,是一个点(x,y),其中生成点G是固定的,公钥K可以简单理解为k个G相加得到的在椭圆函数上的某个点,椭圆函数上的加法有其固定的规则。

解释下关键步骤,这里的I就是用上面图的hmac算法生成,关键是下一步Ki的生成,Ki = point(parse256(IL)) + Kpar,这一步比较绕,我们一个一个看,首先Kpar就是我们的父公钥,它的数学含义就是椭圆曲线上的一个点(x,y),parse256(IL)就是把IL转成一个256位的二进制数字,point(parse256(IL))就是用secp256k1椭圆函数算法获得parse256(IL)*G的点。令kpar为父私钥,我们推导一下公式

Ki = point(parse256(IL)) + Kpar

Ki = parse256(IL) G + kpar G

Ki = (parse256(IL) + kpar) * G

这里我们发现此时子公钥Ki对应的子私钥ki就是parse256(IL) + kpar,其对应我们子私钥的生成算法:用hmc算出来的数字+父私钥,这样就推导出来,确实可以用父公钥和父编码直接生成子公钥。

硬化子密钥

上面的算法中,子私钥是用hmac(父公钥,父编码)直接与父私钥相加生成出来的,如果父编码和子私钥泄漏,父私钥就可以直接被推出来,这就造成了一定的风险。

prih

硬化子密钥算法使用父私钥与父编码去生成子私钥,这样就避免了父编码泄漏后父私钥被泄漏的风险。

参考

https://bitcoinbook.info/wp-content/translations/cmn/book.pdf
https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki#child-key-derivation-ckd-functions

关于游戏服务器与其它互联网业务服务器的思考

到项目组支援差不多半年,这半年什么乱七八糟的东西都干过,写过c++,golang,改过PHP,敲过lua,整过前端,最近又给了我个改router的活,,,这router是拿c#写的。。。。(c#的await真香!),现在对游戏服务器的整个架构和实现算是比较了解,游戏不同于web,不同的游戏类型架构差距应该也很大,,我就拿我在的这个项目组做个简单的总结。

HBase架构浅析

Hbase是GoogleBigTable的开源实现,它的本质就是一个多维的map:map<rowkey,map<column family:qualifier,value>>,概念不作过多介绍,对于一个存储系统,我只关注这几个点,数据读的过程是怎样的?写的过程是怎样的?存储格式是怎样的?

分布式锁的几种实现方式

分布式锁作为一种多机间的同步手段在分布式环境下应用广泛,这篇文章分别用redis,etcd,zookeeper讨论一下如何实现分布式锁。

B站微服务框架自适应限流模块分析

微服务中限流模块是必不可少的,理想的情况是使系统维持在能承受的负载范围内,没有堆积请求,请求处理时间就成了一个很好地判断指标,如果请求处理的时间过长,说明发生了堆积。传统的做法可能是硬性限制qps或队列长度或者根据cpu使用率等指标限制,无法实现自适应限流,根据请求处理时间使用算法限流可以很好地自适应系统的变化。

微服务模式下如何写业务逻辑?

如今微服务模式大行其道,那么服务如何划分,服务之间到底是如何交互的,在微服务模式下开发一个业务模块是怎么实现的?以B站“开源”的代码为例,我挑了一个比较简单的业务:历史记录,分析一下微服务下的业务逻辑该怎么写。

B站直播弹幕系统goim实现分析

goim是B站的直播弹幕系统,整个的设计架构比较简洁,纯go实现。IM系统我觉得也是很经典的系统设计问题,无论做什么业务IM系统都必不可少,当然弹幕这种IM系统和传统的IM有一些区别,这篇文章简单的分析一下goim的设计。

使用C++基于protobuf实现RPC框架

实现了网络库之后,实现RPC就很简单了,重点是如何识别RPC函数和序列化消息,protobuf为我们提供了抽象,在proto文件中定义service字段它就会为我们生成RPC调用函数。

主要参考了muduo的RPC实现,纯异步。

基于ASIO实现C++网络库

项目里的网络库用了asio,看了asio的文档后感觉用asio挺好用的,很容易实现一个网络库,而且有单独的版本可以不依赖boost,我们的目标是实现一个多线程,每个线程都有一个事件循环的异步网络库。

MIT6.824 Lab1 MapReduce实现

MIT6.824是公认的分布式系统经典课程,这篇文章主要介绍Lab1 MapReduce的实现。

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×