├── README.md ├── logo.png ├── mp.png └── topics ├── ldc └── 01 │ ├── fps-dependencies.png │ ├── game.png │ ├── ldc.png │ ├── proof.md │ ├── result-1.png │ └── result-2.png ├── libra └── 01 │ ├── Interactive.png │ ├── account-list.png │ ├── find-request.png │ ├── finish.png │ ├── libra-wallet.md │ ├── libra-wallet.png │ ├── proto.png │ └── request-res.png └── wm └── 01 ├── banner-wm-wallet.png └── wm-wallet.md /README.md: -------------------------------------------------------------------------------- 1 |

2 | 3 |

4 | 5 | ## 介绍 6 | 作者瓦工是W3c.Group区块链技术社区的发起人。希望可以通过简单、可实践的分享让开发者学会区块链应用开发,然后一起探索不同方向上的更多Dapp落地可能!欢迎更多开发者加入W3c.Group([https://w3c.group](https://w3c.group))这个全新形态的区块链技术社区,关注区块链项目,学习区块链技术,或展示你的优质项目找到更多关注者。 7 | 8 | W3c.Group社区中的LearnDapp小组地址:https://w3c.group/g/1124467/join 9 | 10 | ## 列表 11 | |主题 |关键词 |发布日期 | 12 | |---|---|---| 13 | |[开发一个安全且不记私钥的非中心化数字货币钱包 - LearnDapp系列](https://github.com/learndapp/LearnDapp/blob/master/topics/wm/01/wm-wallet.md) |Keyless Wallet Multi-currency | 2019-08-16| 14 | |[学习Filecoin开发一个自己的公链(一)共识 - LearnDapp系列](https://github.com/learndapp/LearnDapp/blob/master/topics/ldc/01/proof.md) |Filecoin Blockchain Proof | 2019-07-28| 15 | |[Libra区块链钱包开发实录附源码 - LearnDapp系列](https://github.com/learndapp/LearnDapp/blob/master/topics/libra/01/libra-wallet.md) |Facebook Libra Wallet | 2019-06-29| 16 | 17 | 18 | -------------------------------------------------------------------------------- /logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/learndapp/LearnDapp/8f8496d71b87b2ed42b1070b10c04b45712a0421/logo.png -------------------------------------------------------------------------------- /mp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/learndapp/LearnDapp/8f8496d71b87b2ed42b1070b10c04b45712a0421/mp.png -------------------------------------------------------------------------------- /topics/ldc/01/fps-dependencies.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/learndapp/LearnDapp/8f8496d71b87b2ed42b1070b10c04b45712a0421/topics/ldc/01/fps-dependencies.png -------------------------------------------------------------------------------- /topics/ldc/01/game.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/learndapp/LearnDapp/8f8496d71b87b2ed42b1070b10c04b45712a0421/topics/ldc/01/game.png -------------------------------------------------------------------------------- /topics/ldc/01/ldc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/learndapp/LearnDapp/8f8496d71b87b2ed42b1070b10c04b45712a0421/topics/ldc/01/ldc.png -------------------------------------------------------------------------------- /topics/ldc/01/proof.md: -------------------------------------------------------------------------------- 1 | # 学习Filecoin开发一个自己的公链(一)共识 - LearnDapp系列 2 | 3 | > 区块链存储一直被认为是最有希望落地的方向,存储的重要性不言而喻,公链普遍存储贵。分片和layer2方案可以提升性能和降低存储成本,但如果以存储作为挖矿基础岂不是一举两得。 4 | > 5 | > 为什么LearnDapp要讲公链?探索落地应用是W3c.Group的使命,每个Dapp开发者一定会涉及链的调用或者合约编写,有一个自己的公链之后,我们能在需要时自行改参数,也免去了在“水龙头”申请测试网络代币的环节,Dapp开发效率自然提升。 6 | 7 | 8 | ### 一些存储类公链 9 | 10 | **Burstcoin** 11 | 12 | 计算一次(一个称为绘图的过程)并将您的工作结果缓存在硬盘空间上,然后挖掘只需要读取缓存,大部分时间你的硬盘空闲,并且每个块只读几秒钟的绘图文件。当硬盘容量越大,能够获得奖励的命中率越大。除此以外,提交答案的过程也是网速越快越有利。由私钥推导出的Account Id然后结合Shabal256最终完成绘图,以此保证缓存不会被复用从而避免作弊。白皮书附录部分提到了Poc和Poc2,也承认了矿工吐槽说硬盘被浪费而没有起到执行绘图以外的作用,因此官方规划了Poc3或者说Dymaxion,集合了纠缠等各种技术。 13 | 14 | **Chia** 15 | 16 | 基于PoSpace的SpaceMint,使用像PoSpace这样的证明系统,每个矿工都可以立即使用计算一个PoSpace,所以需要指定谁“赢”以及何时继续下一个区块。为每个PoSpace分配一个质量,但要最终确定块,必须增加PoSpace具有VDF(Verifiable Delay Functions 可验证延迟函数)的输出。用VDF指定需要多少个连续计算步骤计算输出,在PoSpace的质量上是线性的,具有最佳质量的PoSpace可以最终确定胜出。 17 | 18 | 19 | **Storj和Sia** 20 | 定位是分布式云存储的产品,实现更经济的存储。文件在上传前会分割加密,并且p2p节点保证数据取回速度。这两个项目的白皮书一长一短也是有趣,就如同他们的去中心化程度一样有差别,相对而言sia做的彻底些,没有注册,没有服务器,不需要中介或信任第三方因为引入了智能合约执行。 21 | 22 | 23 | **Lambda** 24 | 25 | Lambda采用PoST时空证明算法保证数据的存储安全,同时实现了VRF+BFT的共识算法保证共识网络的运转效率与可靠性。Lambda通过交易市场连接存储供应方(矿工)与存储需求方(用户),在链上完成去中心化交易。 26 | 27 | 28 | **Filecoin** 29 | 30 | 基于IPFS的设计,也是其从底层去中心化的一个表现。使用Proof-of-Storage共识,包含复制证明(PoRep)和时空证明(PoSt),作用主要有两点:证明矿工做了有效存储;竞争区块打包出块,获取区块奖励。除去硬盘空间大小还有时间(网速快慢)的影响。矿工的算力是他硬盘上存储的数据的大小,存储多少数据在于获取多少订单,而订单数量取决于网络速度快慢,以及报价合不合适。 31 | 32 | 33 | 其他还有genaro等等存储类项目都可以继续了解,这里不展开。在以上项目中,Filecoin的设计目标远大并且也备受关注,出于学习和今后迭代的考虑,接下来我们通过学习Filecoin,完成一个最简单的属于自己的公链。 34 | 35 | 36 | ### PoRep和PoSt 37 | 38 | 时空证明(PoSt)可以理解为矿工持续性地生成复制证明(PoRep)或者说是数字证明,filecoin的PoRep以及PoSt的数据存储证明是通过FPS模块实现,也就是rust-fil-proofs。 39 | 40 | 代码结构如下: 41 | ![](https://raw.githubusercontent.com/learndapp/LearnDapp/master/topics/ldc/01/fps-dependencies.png) 42 | 43 | 其中filecoin-proofs(实现filecoin存储证明的接口)和storage-proofs(存储证明)都有对应的目录。代码已更新,但文档中的图还是之前的,sector-base和storage-backend这两个部分的文件已经转移,比如原先在sector-base中的sector_class.rs移动到了storage-proofs目录下。 44 | 45 | 46 | 你可能会好奇go-filecoin是如何实现go到rust语言的调用的? 47 | 48 | 在rust-fil-proofs的READMD中搜索“Go implementation of filecoin-proofs”可以看到有rustverifier.go和rustsectorbuilder.go这2个文件相关,查看go-filecoin中的对应文件发现都引入了libsectorbuilder这个用cgo实现的package。找到cgo_bindings.go中的函数VerifySeal,能发现在rust-fil-proofs的api.rs中有verify_seal对应,不使用cgo的实现可以自行了解。最终,在go-filecoin的miner.go的CommitSector中调用 ctx.Verifier().VerifySeal(req),VerifySeal就是Verifier接口中的函数实现。 49 | 50 | 51 | 如果想要详细了解各个共识算法,可以参考这篇文章[https://www.chainnews.com/articles/729117267789.htm](https://www.chainnews.com/articles/729117267789.htm)。 52 | 53 | 54 | 55 | ### 运行官方实例 56 | 57 | 根据文档指引,成功运行并参与了replication-game的游戏(Zigzag 10M) 58 | 59 | ![](https://raw.githubusercontent.com/learndapp/LearnDapp/master/topics/ldc/01/game.png) 60 | 61 | 游戏流程是先在本地build完replication-game,再获取seed,然后在本地选择不同的算法计算出proof结果,最后上传结果到官方服务器参与。 62 | 过程中,有两个地方值得关注,一个是生成proof.json,另一个是验证,来看看replication-game的代码: 63 | 64 | **1.从game.rs中的这段开始** 65 | 66 | ```rust 67 | let res = match typ { 68 | proof::ProofType::DrgPoRep => porep_work(prover, params, seed), 69 | proof::ProofType::Zigzag => zigzag_work(prover, params, seed), 70 | }; 71 | ``` 72 | 找到proofs.rs中能找到对应的porep_work和zigzag_work,依赖了```storage_proofs::drgporep```等在rust-fil-proofs的storage_proofs中的函数,通过```extern crate storage_proofs```标记为外部函数接口。 73 | 74 | **2.再看server.rs** 75 | 76 | 既然是基于rocket这个web框架实现,我们就可以从routes目录开始,找到proof.rs文件,其中有validate方法,调用了```storage_proofs::layered_drgporep```。 77 | 78 | 以上提到的zigzag_drgporep和layered_drgporep在rust-fil-proofs的storage_proofs目录下被定义为模块,layered_drgporep中的LayerChallenges和ChallengeRequirements分别是数据复制逻辑和复制证明逻辑的实现和结构,详细算法解析的文章可以看看[https://mp.weixin.qq.com/s/Sd6Y0gSX6HB4BFRKPV_0dQ](https://mp.weixin.qq.com/s/Sd6Y0gSX6HB4BFRKPV_0dQ),代码已更新文章分享的版本较早但也非常值得学习。 79 | 80 | 81 | 82 | ## 简单的共识示例 83 | 84 | 近两年使用Rust语言的区块链项目越来越多,相关的包也逐渐完善。虽说Filecoin使用了golang,但出于方便今后从polkadot/substrate或nervos/ckb等等更多新区块链项目中学习的考虑,我们自己的公链也用Rust实现。若你之前的技术栈中未加入Rust,不妨先看看[https://kaisery.github.io/trpl-zh-cn/ch01-01-installation.html](https://kaisery.github.io/trpl-zh-cn/ch01-01-installation.html),能够帮助你快速上手。 85 | 86 | 代码结构如下: 87 | 88 | ![](https://raw.githubusercontent.com/learndapp/LearnDapp/master/topics/ldc/01/ldc.png) 89 | 90 | rust-fil-proofs中的storage_proofs直接通过storage-proofs包来调用,共识的生成和验证逻辑就在```proofs/all.rs```下。 91 | 92 | 执行以下命令可以生成ldc 93 | ```bash 94 | cargo +nightly build 95 | ``` 96 | 97 | 然后运行 98 | ```bash 99 | ./target/debug/ldc --size 1024 --prover lduser zigzag > proof.json 100 | ``` 101 | 可以生成proof.json 102 | 103 | ![](https://raw.githubusercontent.com/learndapp/LearnDapp/master/topics/ldc/01/result-1.png) 104 | 105 | 最后运行 106 | ```bash 107 | ./target/debug/ldc --proof-path ./proof.json proof 108 | ``` 109 | 可以验证结果 110 | 111 | ![](https://raw.githubusercontent.com/learndapp/LearnDapp/master/topics/ldc/01/result-2.png) 112 | 113 | 114 | 以上过程执行了一次加密到解密验证的过程,体验了PoRep共识的执行,而PoSt可以理解为矿工一定时间内持续地生成复制证明和接受挑战和验证的过程。所以“存力挖矿”的说法相比“硬盘挖矿”更贴切,验证过程涉及到加密计算,并非只是硬盘越大得到的奖励越多。 115 | 116 | 117 | 代码已经上传 [https://github.com/learndapp/LDC](https://github.com/learndapp/LDC),下一部分将实现p2p网络,明确证明者(prover)和检验者(verifier)以及系统之间的关系。此后也会逐步完善我们的公链,以学习的目的略去一些部分做到最小可执行的程度。 118 | 119 | 本文作者是W3c.Group社区([https://w3c.group](https://w3c.group))的核心共建者。W3c.Group社区目前正在进行只对开发者开放的有奖投票活动,以及有奖发文计划。也欢迎前往W3c.Group的“LearnDapp小组”私信组长和本文作者建立联系。 120 | 121 | 122 | **参考连接:** 123 | 124 | 白皮书: 125 | 126 | [https://www.burst-coin.org/wp-content/uploads/2017/07/The-Burst-Dymaxion-1.00.pdf](https://www.burst-coin.org/wp-content/uploads/2017/07/The-Burst-Dymaxion-1.00.pdf) 127 | [https://www.chia.net/assets/ChiaGreenPaper.pdf](https://www.chia.net/assets/ChiaGreenPaper.pdf) 128 | [https://storj.io/storjv3.pdf](https://storj.io/storjv3.pdf) 129 | [https://sia.tech/sia.pdf](https://sia.tech/sia.pdf) 130 | [https://www.lambdastorage.com/doc/Lambda%E9%BB%84%E7%9A%AE%E4%B9%A6-Beta.pdf](https://www.lambdastorage.com/doc/Lambda%E9%BB%84%E7%9A%AE%E4%B9%A6-Beta.pdf) 131 | [https://filecoin.io/filecoin.pdf](https://filecoin.io/filecoin.pdf) 132 | 133 | 代码: 134 | 135 | [https://github.com/filecoin-project/go-filecoin](https://github.com/filecoin-project/go-filecoin) 136 | [https://github.com/filecoin-project/rust-fil-proofs](https://github.com/filecoin-project/rust-fil-proofs) 137 | [https://github.com/filecoin-project/replication-game](https://github.com/filecoin-project/replication-game) 138 | 139 | 文档: 140 | 141 | [https://github.com/waynewyang/analysis-of-filecoin-in-Chinese](https://github.com/waynewyang/analysis-of-filecoin-in-Chinese) 142 | [https://github.com/filecoin-project/go-filecoin/blob/master/CODEWALK.md#sector-builder--proofs](https://github.com/filecoin-project/go-filecoin/blob/master/CODEWALK.md#sector-builder--proofs) 143 | [https://github.com/filecoin-project/specs/blob/master/proofs.md](https://github.com/filecoin-project/specs/blob/master/proofs.md) 144 | -------------------------------------------------------------------------------- /topics/ldc/01/result-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/learndapp/LearnDapp/8f8496d71b87b2ed42b1070b10c04b45712a0421/topics/ldc/01/result-1.png -------------------------------------------------------------------------------- /topics/ldc/01/result-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/learndapp/LearnDapp/8f8496d71b87b2ed42b1070b10c04b45712a0421/topics/ldc/01/result-2.png -------------------------------------------------------------------------------- /topics/libra/01/Interactive.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/learndapp/LearnDapp/8f8496d71b87b2ed42b1070b10c04b45712a0421/topics/libra/01/Interactive.png -------------------------------------------------------------------------------- /topics/libra/01/account-list.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/learndapp/LearnDapp/8f8496d71b87b2ed42b1070b10c04b45712a0421/topics/libra/01/account-list.png -------------------------------------------------------------------------------- /topics/libra/01/find-request.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/learndapp/LearnDapp/8f8496d71b87b2ed42b1070b10c04b45712a0421/topics/libra/01/find-request.png -------------------------------------------------------------------------------- /topics/libra/01/finish.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/learndapp/LearnDapp/8f8496d71b87b2ed42b1070b10c04b45712a0421/topics/libra/01/finish.png -------------------------------------------------------------------------------- /topics/libra/01/libra-wallet.md: -------------------------------------------------------------------------------- 1 | # Libra区块链钱包开发实录附源码 - LearnDapp系列 2 | 3 | > Facebook Libra最近很是吸引眼球,作为看好Libra的区块链应用开发者,自然是要尝试着做些什么了。本文记录了开发一个Libra钱包的具体过程,采用RPC调用方案和链做交互。过程描述较为仔细,请视情况跳过已了解的内容。最后附上了Libra钱包源码的Github仓库地址,欢迎clone。 4 | 5 | ### 1.安装Libra、编译客户端、连接测试网 6 | 安装 7 | ``` bash 8 | git clone https://github.com/libra/libra.git && cd libra 9 | ./scripts/dev_setup.sh 10 | ``` 11 | 12 | 编译客户端 13 | ``` bash 14 | cargo build 15 | ``` 16 | 17 | 如果遇到 google/protobuf/wrappers.proto: File not found (macos环境),则在cargo build之前执行 18 | ``` 19 | export PATH="/usr/local/opt/protobuf/bin:$PATH" 20 | ``` 21 | 22 | 看到下图则表示完成,预计5分钟时间 23 |

24 | 25 | 26 | 27 | 连接测试网 28 | ``` 29 | ./scripts/cli/start_cli_testnet.sh 30 | ``` 31 | 32 | 进入交互终端 33 |

34 | 35 | 36 | ### 2.体验:创建账户、充值、发起交易、查询交易 37 | 38 | 创建账户 39 | ``` 40 | account create 41 | ``` 42 | 43 | 执行 44 | ``` 45 | account list 46 | ``` 47 | 列举刚刚创建的两个账号 48 | 49 |

50 | 51 | 给#0账号充值 52 | ``` 53 | account mint 0 10000 54 | ``` 55 | 56 | 然后查询余额 57 | ``` 58 | query balance 0 59 | ``` 60 | 结果为 `Balance is: 10000` 61 | 62 | 发起交易 63 | 64 | ``` 65 | transfer 0 1 2 66 | ``` 67 | 之后查询交易 68 | ``` 69 | query txn_acc_seq 0 0 true 70 | ``` 71 | 72 | 返回包括Committed transaction和Events和两部分。通过amount可以看出数额最多保留到小数点后6位,这对于稳定币而言足矣。 73 | 74 | 此时尝试退出后重新进入,执行account list返回为空,看似数据被清除了。但当你执行account create以后创建的账户还和之前的一样,再查询余额,之前充值的影响还在,其实数据已经上了测试网络。 75 | 76 | 77 | ### 3.本地运行节点 78 | 79 | 体验过Libra的基本操作后,接下来我们需要自己在本地跑一个认证节点。 80 | 81 | ``` 82 | cargo run -p libra_swarm -- -s 83 | ``` 84 | (注意:请提前关闭本地的代理,否则会报错) 85 | 86 | 如果执行顺利,会和上文执行```./scripts/cli/start_cli_testnet.sh```一样进入交互终端。 87 | 88 | 89 | 可以看到运行在本地的节点,数据是和测试环境独立的,并且退出后数据会重置。 90 | 91 | 92 | ### 4.调用链的API实现 93 | 94 | 95 | 由于Libra提供了rpc调用方式,我们能够很方便的选择语言进行开发。这里我基于nodejs开发了一个npm包`libra-weight`,用于封装rpc方法提供前端调用的基本api。 96 | 97 | libra-weight在实现接口前做了这些事: 98 | 99 | 复制rust源码中的proto文件到项目中,然后执行以下代码: 100 | 101 | ``` 102 | protoc --proto_path=./ --proto_path=/usr/local/Cellar/protobuf/3.7.1/include/ --js_out=import 103 | _style=commonjs,binary:. *.proto 104 | ``` 105 | 106 | 每个.proto文件都会得到编译后的*.pb.js: 107 | 108 |

109 | 110 | 搜索proto中的request,只实现了这几个接口: 111 | 112 |

113 | 114 | 做了接口接下来就是在钱包应用中调用了,此时就把libra-weight发布完放一边,进入Libra-wallet,代码结构以及调用的实现如下: 115 |

116 | 117 | 118 | 119 | 然后前往浏览器中调用接口,就能看到账户的交易信息了 120 |

121 | 122 | 123 | 124 | 示例使用了官方测试网络地址,当然你完全可以如前文中所写,在本地自行搭建验证节点,并且运行示例代码直观感受一番。至于钱包前端已经有不少人做了,可以先去 https://github.com/learndapp/awesome-libra#open-source-wallets 看看钱包的部分。 125 | 126 | 127 | 创建账户可以在Libra终端内进行,因为Libra没有挖矿,可以认为充值属于特殊的一种转账交易,也可以在终端中完成。如果你现在就要做到在钱包应用中创建账户,不妨看看这个案例 https://medium.com/kulapofficial/the-first-libra-wallet-poc-building-your-own-wallet-and-apis-3cb578c0bd52 ,当然这种实现方式只是用于演示,创建账户的操作交由他人或经过网络传输都是不安全的。合理的方案是本地环境创建账户+api调用进行转账交易的广播。 128 | 129 | 130 | **后话** 131 | 132 | Libra项目有很多可以探索的地方。比方说用Move编写的mvir后缀文件,如同以太坊Solidity的sol后缀一样,可以称之为Libra中的智能合约。目前在应用端做尝试的也不少,比如区块浏览器,可以去 https://github.com/learndapp/awesome-libra#blockchain-explorers 的区块链浏览器部分查看。接下来我也会做更多实践,有新发现会持续分享。 133 | 134 | 135 | 文中提到的钱包源码:https://github.com/learndapp/Libra-wallet 136 | 137 | 本文已整理至仓库:https://github.com/learndapp/LearnDapp 138 | 139 | 记得顺手点个Star,这是对我最好的支持。有任何问题也欢迎随时联系我的微信公众号「区块链瓦工」。 140 | 141 | 142 | **参考连接** 143 | 144 | 官方文档: 145 | 146 | https://developers.libra.org/docs/my-first-transaction 147 | https://developers.libra.org/docs/move-overview 148 | https://developers.libra.org/docs/crates/ir-to-bytecode 149 | https://developers.libra.org/docs/reference/libra-cli 150 | 151 | 152 | 153 | 154 | -------------------------------------------------------------------------------- /topics/libra/01/libra-wallet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/learndapp/LearnDapp/8f8496d71b87b2ed42b1070b10c04b45712a0421/topics/libra/01/libra-wallet.png -------------------------------------------------------------------------------- /topics/libra/01/proto.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/learndapp/LearnDapp/8f8496d71b87b2ed42b1070b10c04b45712a0421/topics/libra/01/proto.png -------------------------------------------------------------------------------- /topics/libra/01/request-res.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/learndapp/LearnDapp/8f8496d71b87b2ed42b1070b10c04b45712a0421/topics/libra/01/request-res.png -------------------------------------------------------------------------------- /topics/wm/01/banner-wm-wallet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/learndapp/LearnDapp/8f8496d71b87b2ed42b1070b10c04b45712a0421/topics/wm/01/banner-wm-wallet.png -------------------------------------------------------------------------------- /topics/wm/01/wm-wallet.md: -------------------------------------------------------------------------------- 1 | # 开发一个安全且不记私钥的非中心化数字货币钱包 - LearnDapp系列 2 | 3 |

bannerwmwallet.png

前言

数字货币钱包是很多币圈用户接触到的第一个Dapp,然而不少人在创建钱包的过程中都有些困扰(比如不可截图的助记词备份),尽管这些设计都是出于安全考虑,无可厚非,但繁琐的操作就是现状。当然,中心化的钱包和不同应用在使用体验上无二,可是换取这些便利的代价是将私钥交给平台管理,显然没人能完全放心。为什么数字货币钱包不能既好用又安全?Keyless钱包其实就是一个很好的方向。

什么是Keyless

顾名思义Keyless是指“无钥匙”进入系统,在数字货币钱包中这个key指的是私钥或助记词,相对于账户密码而言,区别在于是否能凭借普通的记忆力记住而无需额外的存储。数字货币钱包的核心是安全管理资产,合理的keyless设计方案能够保证只有用户自己能得到钱包私钥或助记词。

曾经有一种叫脑包的数字货币钱包,其实也能算是Keyless的方案,但是由于存在安全隐患,项目维护者最终选择关闭项目。只是单纯用密码来生成私钥是不靠谱的,这个稍后我们会说到。

目前也有一些团队做出了他们的Keyless钱包,但在使用场景上多少有些限制:

1.没有全端支持,有些特别的依赖,比如icloud或者指纹等

2.服务器关停后虽有方案找回,但依托第三方流程较长,也不方便及时验证

这个也就是为什么想到要用不一样的方案,开发一个Keyless数字货币钱包的原因。在此之前,我们先来看看一些可以用于设计Keyless钱包的技术。

多重签名/秘密共享/门限签名/TEE

多重签名具体来说,就是假设N个人分别持有N个私钥,只要其中M个人同意签名就可以动用某个“联合地址”的资金,比如2-of-2或2-of-3等。2-of-3多重签名的用法:自己生成两个私钥,一个保存为备份,另一个存放在钱包内;剩下的一个私钥由钱包服务端生成和保存。支付时需要用户和钱包服务端共同签名交易。如果用户或者钱包服务端丢失了私钥,则动用备份的私钥转移资金,而钱包服务端无法擅自动用用户的资金。

至于其他概念感兴趣的可以自行搜索,不少大佬都在做这方面的研究,相关的文章不少。

wm钱包实现

wm钱包使用来分层确定钱包,一个seed产生可多个钱包,而这个seed的管理方式类似2-of-2多重签名,但设计方式不同。多重签名是一个方案,但多个公链有不同的实现。出于适配更多数字货币的考虑,wm钱包的技术实现更加简单直接。以下是wm钱包的简单实现。

初始流程:

1.输入邮箱后,请求钱包服务器,发送验证码

2.验证通过后,生成sid+s1,通过邮箱自动备份并通过接口返回

3.本地要求输入pwd,结合sid生成s2

4.s2结合s1生成钱包,本地存储sid+钱包地址,并显示钱包列表

转账流程:

1.根据sid请求钱包服务器获得对应s1(限制频率,尤其对于未命中sid的请求)

2.输入pwd,结合sid生成s2

3.s1结合s2生成钱包私钥,然后在本地进行转账操作

重建流程:

1.从备份邮件找到sid

2.点击重建,输入pwd+sid即可进入,之后sid会被暂存,此后无需再输入

若无法连接服务器的紧急恢复:

从备份邮件中找到sid+s1,结合输入的pwd,即可离线生成并导出钱包的HD助记词和私钥

服务器管理的一半私钥会通过邮件发放,也支持随时备份取回,而任何人知道服务器这边的一半私钥没有你手上的另一半私钥,都无法操作你的钱包。

同样做到Keyless,wm钱包的优势是:

1.全端支持,纯前端实现,只需保证浏览器环境安全就如同保证本地钱包客户端安全

2.可以请求wm钱包服务器上进行挂失,收到请求后将对当前sid的钱包进行冻结,这样即使设备丢失并且意外泄漏了密码也能防止被盗币

具体的技术实现比如钱包的查询、交易、browserify等等细节都会整理在项目的readme中,最好的方式还是直接看代码,这里就不做展开了。仓库地址:https://github.com/learndapp/wm-wallet

安全考虑

懂技术的你可能会质疑以下问题:

是否能在本地环境暴力破解出私钥,从而可能产生暴露的风险?

其实相比较单纯的脑包,wm钱包也加上的密码加密,另外,最终的完整私钥是不做本地存储的,这样也就避免了本地加密数据被盗走后进行暴力猜解密码的可能,这也是为何需要把私钥“一分为二”的原因。

是否存在wm钱包维护者猜解出用户助记词和私钥的可能?

wm服务器端能够知道的数据就是极端情况下图谋不轨者能获得的数据,除了密码外的一切,此时问题就回退到脑包的安全性上,可以通过撞库来生成钱包。只是相对于脑包还加入了邮箱这个因子,就如同增加了指纹这个因子一样,降低了通过撞库来破解的可能性。这种泄漏的情况万一发生,和你在使用其他钱包时的安全性一样,也存在泄漏的可能,并且很可能其他钱包直接暴露了助记词。

另外,wm钱包维护者猜解出用户私钥的作恶成本极高,原因是即使遍历单个账户也有一定计算量,就需要不少时间。并且因为是分层确定钱包的设计,用户可以创建非常多的钱包,而因为wm钱包维护者和钱包使用者物理上隔离,很难知道哪个钱包有余额。即使万一真的尝试出了助记词,也需要监听多个币种的多个钱包的余额,这个成本极大,并且会随着用户量的增加而变得更加不可能。

至于导入的钱包则是完全没有这个问题,因为用户自己管理私钥,也不会有任何和服务端的交互。总之和使用其他普通应用时一样,密码可以设置的复杂些,在有必要时wm钱包也会考虑加上pin码、验证码、ga二次验证等等用于提升安全性的措施。当然,因为代码是开源的,这些额外的措施完全可以交给社区去完成。

后话

看完以上内容,你会了解到合理的Keyless钱包方案一定不是中心化的,keyless钱包是一个兼顾安全和易用性的方案。wm钱包目前是开源的,多币种普适的Keyless钱包方案,任何拿到代码的人都可以自己搭建一个属于自己的Keyless钱包。因时间和个人开发能力有限,技术上的考虑还有所欠缺,期待今后大家能一起加入完善,提出更好的建议或直接参与开发,我们一起完成一个了不起的keyless数字货币钱包。

访问 [https://w3c.market](https://w3c.market) 可以进入wm钱包体验,前往 [https://github.com/learndapp/wm-wallet](https://github.com/learndapp/wm-wallet) 可以查看源码。

--------------------------------------------------------------------------------