专栏首页代码乱弹HBitcoin:C#高级比特币钱包库 - 保护您的财产安全

HBitcoin:C#高级比特币钱包库 - 保护您的财产安全

背景

在几年前,我有写一个叫HiddenBitcoin的钱包库,那是我第一次接触跟比特币相关的项目。多年来我一直在复用这个项目中的代码并不停的改进优化它,虽然到最后我任然没能成功发布一个稳定的版本。可以说这次的HBitcoin就是HiddenBitcoin的后继者了,当初我写HiddenBitcoin的动机是为了学习,然而现在我做HBitcoin是因为某种需求。我一直在不同的Bitcoin项目中重用我的代码。这已经发展到以至于我在这里公布的主类有6个不同的版本。因此,现在是时候把这些代码整理好,并将它们打包成一个我可以随时通过NuGet包安装使用的Bitcoin库。

介绍

HBitcoin库是在NBitcoin的基础上写的。它介于HBitcoin APIBlockchain API之间。它的灵活性要比后者高,但比前者少。如果您要深入的学习Bitcoin,您很有必要去翻阅The C#Bitcoin Book(比特币C#)。

在这学完了这三个部分教程后,您将能够创建一个比特币钱包。

提示 :虽然使用API编程可以帮助开发人员快速开发程序,但开发人员的创新也会被局限于API中。

Nicolas DorierBitcoin的核心开发者,NBitcoinC# Bitcoin库的创建者。在使用本文章的代码库时请记住这个提示。

一个比特币钱包能做什么?

一个比特币钱包有三个关键功能:

  1. 安全地存储密钥并管理对密钥的访问
  2. 监视这些密钥的交易
  3. 创建交易并将它们广播到网络

如何存储密钥?

比特币地址,私钥

比特币地址你应该很熟悉了,你可以往里面存比特币,并且你可以使用相应的私钥来花掉这些比特币。

动态地址

你可能也熟悉钱比特币包并知道他们会为不同的交易生成不同的动态地址。你可能会问为什么这些交易不只使用一个地址?这是为了保护隐私,区块链是公开记账,因此任何人都可以很容易地看到一个比特币地址的收入和支出。因此,避免地址重用是一个更好的主意,尽管这并不能完全解决隐私问题,但这无疑提高了安全性。

HD(Hierarchical Deterministic)钱包(分层确定性钱包)

那么问题又来了,我们如何管理这么多的密钥?存储,监控并花费它们?请注意使用多个密钥会大大地提高比特币钱包的复杂性。

好在HD钱包结构使我们能够只存储一个密钥并从中派生出其他密钥。为了保持我们对NBitcion术语的一致性,我们称之为"BitcoinExtKey"。

关于比特币私钥管理的优化建议

有四种BIP(Bitcoin Improvement Proposal,比特币改进建议)是我们要注意的,分别是BIP32,BIP38,BIP43,BIP44。为了简单起见,你可以把BIP32和BIP38视为相同的BIP。它们定义了一些底层的东西,比如如何派生和加密密钥。这些在NBitcoin中都实现了。BIP43和BIP44建立在BIP32-38的基础上之上,并定义了更多的东西,如关于如何组织和使用密钥的结构。有几种钱包实现了BIP43-44。一开始我也在尝试实现它们,但随后我就决定不用它们了,因为它们不仅让我的项目变得过于复杂,而且我也无法将它应用到以后的一些边缘案例中来。那么这样一来,我就可以为你们提供更简洁的接口了。

多说无益,让我们在代码中见真章!

项目设置

  1. 启动一个新的.NET Core项目
  2. 添加NuGet中的HBitcoin
var network = Network.Main;
//下面输入一个强壮的密码,如"password"
var password = "password";

//用一个密码在指定的网络中的指定路径中创建Safe类
//Safe类用来管理你的私钥种子
//Safe可以自动处理序列
//创建一个Safe类后,它会自动存储在指定的路径中
Mnemonic mnemonic;
Safe safe = Safe.Create(out mnemonic, password, @"Wallets\Wallet.json", network);

//创建Safe类时会同时创建mnemonic(助记符)类,你可以用它来恢复(或复制)Safe类
//你只会在一开始的时候才会接触到mnemonic类
Console.WriteLine(mnemonic);

// 把Safe类恢复到另一个路径中
Safe recoveredSafe = Safe.Recover(mnemonic, password, @"Wallets\SameWallet.json", network);

// 解密/加载一个现存的Safe/钱包文件
Safe loadedSafe = Safe.Load(password, @"Wallets\hiddenWallet.hid");

// 在加载了一个safe后我们最好检查一下它的网络是否正确
if (network != loadedSafe.Network)
	throw new Exception("Wrong network");

// 列出10个地址
for (var i = 0; i < 10; i++)
{
	Console.WriteLine(safe.GetAddress(i));
}

如何解密钱包?

你只需要获得(密码助记符(mnemonic))密码钱包文件)

然后,您就能调用Recover of Load了。

谁知道密码?用户。

谁知道助记符(mnemonic)?正常情况下,用户可以把它写在一张纸上放在家里作为备份。

谁知道钱包文件?正常情况下,它存储在用户的硬盘上。

其他钱包

通常,只用助记符来恢复一个钱包就够了。但我觉得这不安全,所以我们的这个钱包不能像那样。

创建时间

var safe2 = Safe.Recover(mnemonic, password, "Wallet.json", network,
	  creationTime: DateTimeOffset.ParseExact("2017-02-20", 
	  "yyyy-MM-dd", CultureInfo.InvariantCulture));
Console.WriteLine(safe.CreationTime);

当你创建一个钱包时,它也会自动保存它的创建时间,这对于编写一些SPV钱包来说非常方便。因此,当您恢复钱包时,您还可以使用创建时间作为参数,如果您没有不填写这个参数,它会默认为可能的最早创建时间,这个时间是硬编码的:

public static DateTimeOffset EarliestPossibleCreationTime
	=> DateTimeOffset.ParseExact("2017-02-19", 
	"yyyy-MM-dd", CultureInfo.InvariantCulture);

这是我第一次介绍创建时间这个概念的日期。如果您没有尝试使用早些的创建时间来恢复钱包,则系统会默认使用EarliestPossibleCreationTime。

安全账户和Hd路径类型

var alice = new SafeAccount(id: 2);
safe.GetAddress(index: 1, hdPathType: HdPathType.Receive, account: alice);
safe.GetPrivateKey(index: 1, hdPathType: HdPathType.Receive, account: alice);

你可以随意地创建账户。在上面的代码中,我创建了id = 2的Alice帐号并恢复了一些她的密钥。

你也可以注意到我指定了HdPathType为receive。如果你没有指定其他参数的话将会用这个作为默认值。请注意,在某些术语中使用了“external(外)”和“internal(内)”来接收和更改地址。当您收钱和消费您钱包的资金时,这是很重要的。在接收资金时,一定要用HdPathType.Receive参数;在花费资金时一定要用HdPathType.Change参数来改变地址。这将使您的钱包更加安全。当然你还可以反复使用一个相同的地址来交易,我当然反对这么做。

结语

我建议你不要应用你自己的密钥存储方案,除非你真的胸有成竹。如果由于某种原因,我的钱包方案的不足以满足您的需求,你可以在GitHub发问,我会尽我所能帮助你。

本文的版权归 飞翔的猪脚粉 所有,如需转载请联系作者。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 如何正确投资比特币、区块链和其他加密货币?

    原文地址:https://medium.com/@nellsonx/how-to-properly-invest-in-bitcoin-blockchain-a...

    Ksher
  • EOS创始人BM:去中心化的区块链治理

    我们EOS社区已经开展了一次大型实验,来看看全球社区是否可以在没有目前世界各国政府众所周知的缺点情况下进行自我管理。比特币被视为是“去信任”的货币体系,因为控制...

    点滴科技资讯
  • 什么是比特币?解释你需要了解的比特币知识

    如果你不熟悉加密货币,那么你的第一个问题很可能是“什么是比特币?”。用简单的话讲,比特币是一种基于密码技术实现安全性的加密货币或者说是一种数字财产。比特币和大多...

    青橙.
  • 比特币黑客攻击手段大揭秘

    最近一段时间,比特币彻底火了。无论是新闻媒体、行业龙头还是资本市场都对其反映敏锐,可以看出比特币正站在风口浪尖,受到各方高度关注。然而,当涉及到安全方面时,比特...

    IT派
  • 火币区块链产业专题报告:钱包篇(附PDF下载

    狭义上数字资产钱包为私钥存储工具,广义上含余额查询、发送交易等基本功能。2018年Q1全球数字资产钱包用户数约2395万,同比增长86%,发展迅速。基于火币研究...

    辉哥
  • 1分钟链圈 | 吴忌寒:比特大陆在美国正部署巨大的扩张计划!首个区块链啤酒自动售货机将亮相2018共识大会

    区块链大本营
  • 源中瑞数字资产多币种钱包app定制开发

    源中瑞数字资产多币种钱包app定制开发度误伤,采用hd钱包技术,多重签名加密保障数字资产的安全,支持提供各类专业算法,提供用户管理、充值、提现、交易等功能,支持...

    v13823115027
  • 简明介绍比特币钱包及其安全性

    前两天介绍了TEE与区块链、比特币钱包的一些东西!也许不是很明白比特币钱包这个东西,(本文来自于知乎内容、整理、编辑) TEE与比特币硬件钱包应用之Ledger...

    安智客
  • 比特币和加密货币入门

    现在人们对加密货币空间产生巨大的兴趣的同时也同样也存在这疑惑与不解。比特币,加密货币,区块链,ICOs(各种首发代币)。这些都意味着什么?对这些外来概念,我们的...

    都林
  • 除了创造比特币,中本聪还教了我们如何保护账号安全

    区块链时代最大的秘密,就是比特币之父中本聪。坐拥100万比特币(峰值时接近200亿美元)的中本聪,自从2011年离场后,竟再也没有动过这笔财富……这份淡然和从容...

    区块链大本营
  • 1分钟链圈 | 韩国科技部:到2022年培养1万名区块链人才!报告:十大数字货币交易所日均收入170万美元,币安位列第一

    这里是 6 月 21 日的每日1句话新闻晚报,只需1分钟,看看全球最热、最新的区块链新闻。

    区块链大本营
  • 1分钟链圈 | 又一高校开设区块链课程!这次是西南财经大学;Vitalik Buterin眼中的靠谱项目:需内置去中心化治理机制

    这里是 6 月 26 日的每日1句话新闻晚报,只需1分钟,看看全球最热、最新的区块链新闻。

    区块链大本营
  • 数字货币钱包安全白皮书

    近期,我们对应用市场上流通的热钱包以及冷钱包进行了相关安全审核评估,发现了很多安全问题,360信息安全部依靠通过对各类攻击威胁的深入分析及多年的安全大数据积累,...

    FB客服
  • 2019年度区块链安全复盘总结

    如果说2018年,我们做区块链安全拥有了“上帝视角”,那过去的2019年,我们则收获了“圣母心态”。

    区块链大本营
  • 1分钟链圈 |纽约大学经济学家:比特币是胡说,只是吸引傻瓜!网易:拿下数字货币钱包市场 有望成为区块链版的「支付宝」

    区块链大本营
  • 什么是数字货币?

    中国人民银行推出 数字货币的项目叫作DCEP( Digital Currency Electronic Payment),也就是数字货币和电子支付工具。数字货币...

    王小明_HIT
  • 数字货币钱包安全白皮书

    区块链技术的迅速发展,使得数字货币渐渐走入的大众的视线,在2017年底,这股热潮达到顶峰,直接搅动着金融市场与科技市场,大量的数字货币交易流水催生了数字钱包开发...

    伍尚国
  • 知名比特币轻钱包 Electrum 曝出漏洞,请及时更新到 3.0.5

    本文由币乎社区(bihu.com)内容支持计划奖励。 这是「区块链技术指北」的第 17 篇文章。 如果对我感兴趣,想和我交流,我的微信号:Wentasy,加我时...

    robinwen
  • NBitcoin:密码学第2部分

    在我第一篇关于NBitcoin的文章之后,我决定写一个面向.NET开发者的,关于NBitcoin比特币网关的系列文章。

    飞翔的猪脚粉

扫码关注云+社区

领取腾讯云代金券