一.钱包相关的术语
-
助记词:通过算法从词库里面产生12-24个单词,目前支持多种语言。
-
随机种子:使用助记词通过算法产生的一个随机字符串。
-
私钥:钱包中最重要的东西,钱包实际上就对私钥进行管理,现在私钥有主私钥和派生私钥的说法。
-
主私钥:钱包私钥,由助记词产生的随机种子生成,主私钥被盗的话,你的整个钱包的钱将全部被盗。
-
派生私钥:由主私钥通过bip分层协议生成的私钥,派生私钥丢失,只会丢失单一账户上的数字资产。
-
备份钱包:其实也叫备份助记词,现在的钱包基本上都是用助记词恢复的。
-
备份私钥:对钱包的主私钥或者派生私钥进行备份,通过主私钥可以找回钱包中所有的账户,通过派生私钥只能找回其中的一个账户。
-
导入钱包:通过导入助记词或者私钥的方式生成以前的钱包。
-
导入私钥:通过导入私钥生成多链多账户钱包,或者单链单账户钱包。
-
单链钱包:只支持一条链的钱包,比方说比特币钱包。
-
多链钱包:支持所有币种的钱包。
-
单账户钱包:每种币只支持一个账户。
-
多账户钱包:每种币支持多个账户。
-
地址:类似于银行卡账户,通过地址可以查询到目前账户上的余额。
-
公钥:对所有人公开的秘钥。
-
签名:在发起数字资产转账时,所有的币种都要对转账的数据进行签名,签名的数据量对于不同的币种不一样。
-
空投:就是批量打币。
-
bip协议簇:HD分层钱包中的一个重要的规定,是数字货币发展的必然产物。
-
非确定性钱包:每个账户对应一个私钥,私钥不好管理。
-
确定性钱包:有主私钥,通过主私钥可以生产其他所有币种的私钥,单不能支持多账户。
-
确定性分层钱包:有主私钥,通过主私钥可以生产其他所有币种的私钥,支持多账户。
二.目前市场的钱包简介
1.以太坊的Mist钱包
说到以太坊钱包,第一个要说的当然就是Ethereum官方钱包+浏览器Mist。Mist是一个全节点钱包(全节点钱包通俗的来说就是同步了全部的以太坊区块信息的钱包)。也就是说打开钱包后,电脑会自动同步全部的以太坊区块信息,但是同步现有以太坊公链数据的时间比较长。Mist在开发的时候也可以在你的私链上使用,关于Mist详细内容,后面我们将详细介绍。
2.Parity
Parity的目标是成为最快,最轻,最安全的以太坊客户端。 使用最尖端的Rust编程语言来开发Parity。 Parity获得GPLv3许可,可用于以太坊的钱包需求。原以太坊基金会部分成员,开发的钱包。功能强大,也是一个全节点钱包。
3.MyEtherWallet
MyEtherWallet 作为一个轻钱包,上手难道不大,无需下载,在直接在网页上就可以完成所有的操作。在MyEtherWallet上生成的私钥由用户自我保管,平台方并无备份。
4.imToken
移动端钱包,操作简便,容易上手,功能齐全,在imToken上生成的钱包私钥保存在手机本地,平台方并无备份。
5.MetaMask
MetaMask是一款在谷歌浏览器Chrome上使用的插件类型的以太坊钱包,该钱包不需要下载,只需要在谷歌浏览器添加对应的扩展程序即可,非常轻量级,使用起来也非常方便。
6.ledger
Ledger是一个硬件钱包,是一个安全存储私钥的硬件设备,查看钱包和发送交易时,硬件钱包需要与软件钱包配合才能使用。你既可以使用Ledger自己开发的软件钱包,也可以使用其他团队开发的软件钱包。以以太币为例,你可以配合以太币网页钱包myetherwallet.com或者Parity钱包使用Ledger。
7.kcash
移动端钱包,操作简便,支持单链,多链钱包。
8.biwrok
一款企业级应用钱包。
9.linkeye钱包
与Linkeye公链配合使用的钱包。
10.番茄钱包
如果大家知道还有什么的钱包,可以提供作者,作者进行补充。开源钱包也提供给作者,作者将在后面对钱包的源码进行分析
三.钱包的发展历史
钱包只含有密钥,而包含钱币。 每个用户有一个包含多个密钥的钱包。 钱包只包含私钥/公钥对的密钥链。因此不要误解为钱包里面包含的是钱,钱包只是私钥的集合,你的钱币存储中区块链的区块中。
1.非确定性钱包
在最早的一批区块链钱包中,钱包只是私有的集合,这些私钥之间相互独立,没有任何关联,这种类型的钱包咱们把他称为非确定性钱包。举个例子,比 特币核心客户端预先生成100个随机私钥,从最开始就生成足够多的私钥并且每个密钥只使用一次。这种钱包现在正在被确定性钱包替换,因为它们难以管理、 备份以及导入。随机密钥的缺点就是如果你生成很多私钥,你必须保存它们所有的副本。这就意味着这个钱包必须被经常性 地备份。每一个密钥都必须备份,否则一旦钱包不可访问时,钱包所控制的资金就付之东流。这种情况直接与避免地址重复使用的原则相冲突——每个比特币地址只能用一次交易。地址重复使用将多个交易和地址关联在一起,这会减少隐私。当你想避免重复使用地址时,零型非确定性钱包并不是好的选择,因为你要创造过多的私钥并且要保存它们。虽然比特币核心客户端包含零型钱包,但比特币的核心开发者并不鼓励大家使用。
.:

2.确定性钱包和确定性分层钱包
其中所有的密钥都是从一个主密钥派生出来,这个主密钥即为种子(seed)。该类型钱包中所有密钥都相互关联,如果有原始种子,则可以再次生成全部密钥。确定性钱包中使用了许多不同的密钥推导方法。最常用的推导方法是使用树状结构,称为分级确定性钱包或HD钱包
2.1.确定性钱包
确定性,或者“种子”钱包包含通过使用单项离散函数而可从公共的种子生成的私钥。种子是随机生成的数字。这个数字也含有比如索引号码或者可生成私钥的“链码”(参见“ 分层确定性钱包(BIP0032/BIP0044)”一节)。在确定性钱包中,种子足够恢复所有的已经产生的私钥,所以只用在初始创建时的一个简单备份就足以搞定。并且种子也足够让钱包导入或者导出。这就很容易允许使用者的私钥在钱包之间轻松转移。
.:

2.2.分层确定性钱包
确定性钱包被开发成更容易从单个“种子”中生成许多密钥。确定性钱包的最高级形式是通过BIP0032标准定义的HD钱包。HD钱包包含以树状结构衍生的密钥,使得父密钥可以衍生一系列子密钥,每个子密钥又可以衍生出一系列孙密钥,以此类推,无限衍生。
.:

相比较随机(不确定性)密钥,HD钱包有两个主要的优势。第一,树状结构可以被用来表达额外的组织含义。比如当一个特定分支的子密钥被用来接收交易收入并且有另一个分支的子密钥用来负责支付花费。不同分支的密钥都可以被用在企业环境中,这就可以支配不同的分支部门、子公司、具体功能以及会计类别。
HD钱包的第二个好处就是它可以允许让使用者去建立一个公共密钥的序列而不需要访问相对应的私钥。这可允许HD钱包在不安全的服务器中使用或者在每笔交易中发行不同的公共钥匙。公共钥匙不需要被预先加载或者提前衍生,而在服务器中不需要可用来支付的私钥。
四.钱包的账户体系
目前的区块链技术中,记账的方式主要有两种形式,以比特币为代表的UTXO模型,UTXO是该记账模式的缩写,它的英文全拼为Unspent Transaction Output,汉语翻译为“未花费的交易输出”;对于“未花费的交易输出”这个名词对于大多数人来说,应该会比较陌生。如果你觉得陌生的话,请接着文章下面的分解。另一种是以以太坊为代表的基于账户/余额的记账模式,基于账户/余额的这种记账模式比较简单了,和现在的银行卡记账方式一样,大多数人都能够很清晰地理解这种模型。
1.UTXO模型
1.1.模型解说
在解说UTXO模型之前,我想先说说一个名词,叫做Transaction,即交易,Transaction和UTXO是相辅相成的,下面先来举个例子:
张三:通过挖矿得到了120个比特币,现在张三饿了,想要花费2个比特币去购买一个面包。这是只是举例而已,以现在比特币的价格,1个比特币就可以买到一大堆面包了。
现在我们假设,李四是面包点营业主
这样的话,在比特币中,张三付给李四将一次性付给李四120块,李四给张三找零118块,这里其实产生了两笔交易,咱们可以这样理解,张三的钱被分成了两份,其中118打给了自己,剩下的2块打给了李四。
交易与交易之间组成了网状关系,1个交易的输出,成为了下1个交易的输入;下1个交易的输出,又成了下下1个交易的输入。所有的钱,在这个网络中流动,每1笔钱的去向、来源,都是可追溯的,而这也是区块链网络的一个重要特点。
上面的讲解可能大多数人都比较懵逼,接下来咱们用比较通俗的方式来说明UTXO和Transaction到底是什么
在现实生活中,一笔转账对应的事一个付款人和一个收款人,而在比特币种,一笔转账对应的事多个转账人和多个收款人。
现在咱们仔细分析一下上面的这个例子,对于张三买面包这个案列
付款人:张三 120块 收款人:张三 118块,李四 2块
张三的120,转118块给自己,转2块给李四,对应到交易里面,就是这笔交易有1个输入,2个输出!
下面来一个多输入,多输出的案列
考虑如下场景:用户A和用户B之间发生了一个交易T3,A向B转100元。 A的100元,来自T1:C向A转的80元 + T2:D向A转的30元(共110元,但A只转了100元给B,10元找零返回给A的账号)。 同理,C向A转的这80元,来自用户E、F的某次交易… D向A转的这30元,来自用户E的某次交易…
这个交易就有2个输入,2个输出: 2个输入(也就是2个UTXO): T1: C向A转的80元 T2:D向A转的30元
2个输出: B:100元 A:10元(找零)
当你理解上面的例子时,我们再来说一下UTXO,理解上面的例子对你理解UTXO会特别有帮助。
1.比特币的交易中不是通过账户的增减来实现的,而是一笔笔关联的输入/输出交易事务。
2.每一笔的交易都要花费“输入”,然后产生“输出”,这个产生的“输出”就是所谓的“未花费过的交易输出”,也就是UTXO。每一笔交易事务都有一个唯一的编号,称为交易事务ID,这是通过哈希算法计算而来的,当需要引用某一笔交易事务中的“输出”时,主要提供交易事务ID和所处“输出”列表中的序号就可以了。
3.由于没有账户的概念,因此当“输入”部分的金额大于所需的“输出”时,必须给自己找零,这个找零也是作为交易的一部分包含在“输出”中。
4.旧的UTXO不断消亡,新的UTXO不断产生。所有的UTXO,组成了UTXO Set 的数据库,存在于每个节点
5.任何1笔UTXO,有且仅可能被1个交易花费1次
6.1个UTXO,具有如下的表达形式: 1个UTXO = 1个Transaction ID + Output Index
1.2.UTXO模型的区块链钱包余额形式
深刻理解了UTXO的概念,钱包就很容易理解了,某个人的钱包的余额 = 属于他的UTXO的总和;在这里,你会发现一个不同于现实世界的“银行”里的一个概念,在银行里,会存储每个账号剩余多少钱。但这里,我们存储的并不是每个账号的余额,而存的是1笔笔的交易,也就是1笔笔的UTXO,每个账户的余额是通过UTXO计算出来的,而不是直接存储余额。
2.账户余额模型
账户余额模型和当今的银行卡一样,当我们需要花费钱的时候,会去先检查我们的余额是否足够。转账的整个业务流程和银行卡一样的,基于账户的余额。
钱包技术指南一书的GitHub地址:https://github.com/guoshijiang/blockchain-wallet
关注问我技术公众号,加小问,拉您入技术交流群:


2万+





