正如你所看到的,生成JD钱包密钥很容易。 但是,如果我们想通过电话或手写方式轻松传输这样的密钥,该怎么办?
像Trezor这样的冷钱包,可以从一个容易记下的句子中生成HD密钥。 他们称这种句子为“种子”或“助记词”。 它最终可以通过密码或PIN码进行保护。
用于生成“易于编写”句子的语言称为Wordlist
Mnemonic mnemo = new Mnemonic(Wordlist.English, WordCount.Twelve);
ExtKey hdRoot = mnemo.DeriveExtKey("my password");
Console.WriteLine(mnemo);
minute put grant neglect anxiety case globe win famous correct turn link
现在,如果您有助记符和密码,您可以恢复hdRoot键。
mnemo = new Mnemonic("minute put grant neglect anxiety case globe win famous correct turn link", Wordlist.English);
hdRoot = mnemo.DeriveExtKey("my password");
目前支持wordlist的语言有英文,日文,西班牙文,中文(简体和繁体)。
Dark Wallet
尽管Dark Wallet不再使用,但了解这里介绍的概念仍然很有价值。Dark Wallet是一个可以解决我们两个最初问题的实用解决方案:
- 防止过时的备份
- 将密钥/地址生成委派给不可信任的对等体
它有一个杀手锏功能
您必须与其他人共享一个地址(称为StealthAddress),而不会泄露任何隐私。
让我们提醒自己,如果您与所有人共享一个BitcoinAddress,那么所有人都可以通过查阅区块链来查看您的余额...... StealthAddress并非如此。
由于它部分解决了由比特币的伪匿名引起的隐私泄漏这一重要问题。一个更好的名字应该是:一个地址,因为硬币的接收者只需与Payer共享一个地址。使用该地址,支付方能够生成许多新地址,并且发送到这些地址的硬币将由接收方花费。只有Payer和Receiver知道这些地址是相关的,调查公开区块链的第三方没有。
在Dark Wallet术语中,以下是不同的角色:
- 付款人知道接收者的StealthAddress。
- 接收者知道Spend Key,可以让他花掉他从这种交易中收到的硬币,这是不可见的。
- Scanner知道Scan Key,允许他检测该笔交易是否属于接者,这是不可见的。
其余的是操作细节。在下面,这个StealthAddress由一个或多个Spend PubKeys(用于多信号)和一个Scan PubKey组成。
var scanKey = new Key();
var spendKey = new Key();
BitcoinStealthAddress stealthAddress = new BitcoinStealthAddress (
scanKey: scanKey.PubKey,
pubKeys: new[] { spendKey.PubKey },
signatureCount: 1,
bitfield: null,
network: Network.Main);
付款人将采取您的StealthAddress,生成一个名为Ephem Key的临时密钥,并生成一个Stealth Pub Key,从中生成付款的比特币地址。 请注意,这个比特币地址是一个特殊的base58地址,它不被比特币核心等标准比特币实现认可。
然后,他们将Ephem PubKey打包到交易的OP_RETURN中嵌入的Stealth Metadata对象中(就像我们为第一个挑战一样)他们还会将输出添加到生成的比特币地址中。
var ephemKey = new Key();
Transaction transaction = new Transaction();
stealthAddress.SendTo(transaction, Money.Coins(1.0m), ephemKey);
Console.WriteLine(transaction);
EphemKey的创建是一个实现细节,您可以省略它,因为NBitcoin会自动生成一个:
Transaction transaction = new Transaction();
stealthAddress.SendTo(transaction, Money.Coins(1.0m));
Console.WriteLine(transaction);
{ "hash": "7772b0ad19acd1bd2b0330238a898fe021486315bd1e15f4154cd3931a4940f9",
"ver": 1,
"vin_sz": 0,
"vout_sz": 2,
"lock_time": 0,
"size": 93,
"in": [],
"out": [
{ "value": "0.00000000",
"scriptPubKey": "OP_RETURN 060000000002b9266f15e8c6598e7f25d3262969a774df32b9b0b50fea44fc8d914c68176f3e" },
{ "value": "1.00000000",
"scriptPubKey": "OP_DUP OP_HASH16051f68af989f5bf24259c519829f46c7f2935b756 OP_EQUALVERIFY OP_CHECKSIG"
}
]
}
然后付款人添加并签署输入,然后在网络上发送交易。知道StealthAddress和Scan Key的扫描器可以恢复Stealth PubKey和期望的BitcoinAddress付款。
然后Scanner 检查交易的一个输出是否与该地址相对应。 如果确实如此,则Scanner通知接收方关于该交易。
接收方可以用他们的Spend Key 获得该地址的私钥。
解释Scanner作为扫描交易的代码以及作为接收方如何发现私钥的代码将在后面的TransactionBuilder(其他类型的所有权)部分中进行解释。
应该指出的是,StealthAddress可以有多个支出公钥,在这种情况下,地址代表多个sig。
Dark Wallet的一个限制是使用OP_RETURN,所以我们不能像在比特币转账部分那样容易地在交易中嵌入任意数据。 (目前的比特币规则每个交易只允许一个80字节的OP_RETURN)
来源:区块链研究实验室(bc-tech-lab)