数字货币钱包原理的理解

96
rectinajh
2018.01.11 20:04* 字数 2028

1,数字钱包到底是什么?

钱包是作为提供用户界面的应用程序。 钱包控制用户访问权限,管理密钥和地址,跟踪余额以及创建和签署交易。更为狭义的是,从程序员的角度来看,“钱包”是指用于存储和管理用户密钥的数据结构,钱包其实是私钥的容器,常见误解是比特币钱包含有比特币, 其实钱包里只有钥匙。 “钱币”被记录在比特币网络的块链中。 用户通过与他们的钱包中的密钥签署交易来控制网络上的钱币。 钱包是真正的密钥链,包含私钥/公钥对。钱币以交易输出的形式存储在区块链。

2,手机客户端的数字钱包需要到底需不需要服务端的支持?

区块链不是去中心化的,是分布式的节点程序,手机钱包如果需要中心化服务端支持,不是相互矛盾了?这是我们争论最大的地方,也是比较晕的地方?

其实还是需要从一个叫简单支付验证(SPV,Simplified Payment Verification)东西说起。总所周知比特币是分布式的全节点程序,目前所有区块数据节点数据在一百多G,比特币网络里的节点在打包一个区块的时候,会对区块里所有的交易进行验证,一个交易还会得到6至7次的确认来确保交易最后的完成。用简单支付验证时,只要判断出一个交易在主链上的某个区块里出现过,则可以证明该交易之前已被验证过。SPV节点验证交易在那个区块时,SPV充分利用默克树结构,在寻找交易时,只需下载寻找区块头而不是整个区块。区块头只有80字节,每小时6个,一年也就4M大小。如何根据交易哈希定位在哪一个区块里呢?比特币提供了一种叫做布隆过滤器(Bloom filter)的功能,节点会在通信链路上建立一个这样的过滤器,限制只接受含有目标地址的交易,从而能过滤掉大量不相关的数据,减少客户端不必要的下载量。

这样一来,借助这个功能,“轻钱包”不用借助中心化的方式也可以实现,在手机上面运行也不是太大问题。

然后在聊聊几种在客户端中验证区块链的方法:

1.全节点(如 bitcoin-core 核心钱包),维护着全部的区块链数据(当前在一百多GB以上),完全去中心化,同步所有数据;也是最安全的模型是比特币核心遵循的,也被称为“厚”或“全链”客户端。该安全模型通过下载和验证从创世区块到最新发现的区块确保区块链的有效性。

2.SPV轻钱包,只维护与自己相关的区块链数据,基本上去中心化(要依赖比特币网络上的其他全节点),仅同步与自己相关的数据;SPV客户端知道merkle root和相伴随的交易信息,并从完整节点中请求各自的merkle 分支。一旦merkle分支被检索,证明了区块中交易的存在,SPV客户端然后可以把区块深度看做交易有效性和安全性的代理。

3.中心化钱包,不依赖比特币网络,只依赖自己的中心化服务器,不同步数据,所有的数据均从自己的中心化服务器中获得;

瘦客户端(轻量级客户端):参考了SPV的机制,SPV节点不验证他们不感兴趣的交易;他们只是验证区块头。在监听收款地址时,客户端在本地只需保存与用户可支配交易相关的数据。

“轻钱包”是用瘦客户端模式实现的钱包,因为不存储完整区块链。
简言之,SPV的应用场合往往是为发货做准备(知道钱到帐了),“轻钱包”的应用场合往往是数钱或花钱。虽然“轻钱包”中部分借鉴了SPV的机制,但和SPV是完全不用的应用方向。

轻量级客户端能够向运行完整节点的服务器提交查询(即名称),并且服务器将返回该名称的值,以及证明返回值实际上是数据库中该名称的最新更新。

市场上常见的比特派,imtoken钱包,Blockchain钱包,是去中心化轻钱包,你可以掌握自己比特币的私钥保证不会被平台挪用,去中心化的意思是钱包完全由用户控制,不用担心平台对你的资产动手脚。

还有一些问题,暂时没有想清楚?

3,比特币,莱特币,以太坊,这些各种各样的token(代币)为什么能在同一个钱包中保存?

手机钱包如果是那种有中心化的服务器,不同的token的代币,在一个钱包其实很好实现,相当于每个代币做一个API。还有一种是spv钱包,它不需要服务器,在网络中有其他节点相互配合就可以完成验证,但是需要在手机里完成交易验证,加密解密运算很消耗手机性能,还有需要在手机完成管理私钥,可能很多会弄丢。这就导致了体验很糟糕。spv钱包因为需要在同一个区块链上完成节点数据请求,不能兼容多个token。只能做一个币。

4,钱包的收发数字货币过程是如何实现怎样的?我的数字货币发给对方,数字是怎么减少的,接收数字货币后,数字又是怎么增加的?

5 移动客户端钱包是向包含全节点区块链的服务端请求数据,通过接口查询交易信息,进行数字货币发送和接收,服务端如何设计数据接口给客户端?

一点小感想:

最近参与了qyb手机移动端钱包开源项目,我认为理想的项目协作方式好比区块链分布式节点的方式自由运行,任何感兴趣的节点都可以参与,愿意投入贡献力量就不会被拒绝,任何有价值的新想法,新思路,任何其他节点都能看到的,会被点赞。

这种开源项目开发过程,其实就是一起研究学习的过程。首先大家独自研究和学习,查资料,为自己的看法找足充分的论点和证据支持,然后共同讨论,发表看法,如果谁也不能说服另外其他节点,我们再去研究,去查资料,再学习,最后每个开放节点,对共同事实应当达成共识(条件是大家是理性的,客观的),如果还不能达成共识,那就去做,能做出来的,有成果你就是对的,以事实为依据。

区块链的技术世界