- 1.前言
- 2.为什么是区块链编程而不是比特币编程?
- 3.为什么是 C#?
- 4.预备条件
- 5.本书众筹
- 6.补充阅读
- 7.图标
- 8.许可: CC (ASA 3U)
- 9.项目设置
- 1.比特币地址
- 2.交易
- 3.区块链
- 4. 区块链不仅仅是比特币
- 5.支付比特币
- 6.作为真实性验证方法的所有权证明
- 1.足够随机了吗?
- 2.秘钥加密
- 3.秘钥的生成
- 1.P2PK[H] (向公钥付款 [Hash])
- 2.多重签名
- 3.P2SH ( 向脚本哈希付款)
- 4.灵活机动性
- 5.使用 TransactionBuilder
- 1.颜色币
- 2.发行一项资产
- 3.传输资产
- 4.单元测试
- 5.李嘉图合约
- 6.流动的民主
- 7.烧钱和声誉证明
- 8.存在性证明
- 1.比特币发展的挑战
- 2.如何证明一个币存在于区块链上
- 3.如何证明一个颜色币存在于区块链上
- 4.断开与第三方 API 的信任关系
- 5.防止延展性攻击
- 6.保护你的私钥
1.比特币地址
你的比特币地址是用来接收别人付款的。你也许知道,钱包软件使用私钥来付款。
一个比特币地址由两部分组成,一部分是公钥哈希值经过 Base58check 编码的组合,另一部分是关于这个网络地址的信息。Base58check 编码有一些很精巧的特性,比如用于避免拼写错误的验证码,避免模糊的字符比如 0 和 O 。
拾遗:TestNet 是用于开发目的的比特币网络,在这个网上的比特币没有任何价值。MainNet 才是人人知道的比特币网络
你也许不知道,就区块链而言,还谈不上比特币地址。内部来说,比特币协议使用 ScriptPubKey 验证比特币的接收动作。ScriptPubKey 是一段简短的脚本,用于解释在什么情况下才能声明比特币的所有权。随着本书深入分析,我们将考察 ScriptPubKey 指令的类型。ScriptPubKey 也许包含哈希计算过的公钥,这个公钥允许支付比特币。
拾遗:在 MainNet 上进行比特币编程时犯的错误印象更加深刻
下图说明了公钥、私钥、比特币地址和 ScriptPubKey 的关系。
现在我们可以用代码向你演示它们的关系了。打开 Chapter1.cs,在顶部添加 using NBitcoin; 然后编写下面的方法。
public void Lesson1()
{
Key key = new Key(); //generates a new private key.
PubKey pubKey = key.PubKey; //gets the matching public key.
Console.WriteLine("Public Key: {0}", pubKey);
KeyId hash = pubKey.Hash; //gets a hash of the public key.
Console.WriteLine("Hashed public key: {0}", hash);
BitcoinAddress address = pubKey.GetAddress(Network.Main); //retrieves the
bitcoin address.
Console.WriteLine("Address: {0}", address);
Script scriptPubKeyFromAddress = address.ScriptPubKey;
Console.WriteLine("ScriptPubKey from address: {0}", scriptPubKeyFromAddress);
Script scriptPubKeyFromHash = hash.ScriptPubKey;
Console.WriteLine("ScriptPubKey from hash: {0}", scriptPubKeyFromHash);
}
按 F5 检查输出。你刚刚学到了如何创建一个私钥,对应的公钥、公钥哈希、比特币地址和 ScriptPubKey。
我们还没有深入细节,注意 ScriptPubKey 看上去跟比特币地址没有关系,但是它的确显示了公钥的哈希值。注意我们为何能从比特币地址产生 ScriptPubKey?这一步就是所有比特币客户端做的事情,它把人机交互友好的比特币地址翻译成区块链可读的地址。
比特币地址由一个网络识别码和公钥哈希组成。学习到这些,就可以由 ScriptPubKey 和网络识别码产生比特币地址,如下面代码所示:
public void Lesson2()
{
Script scriptPubKey = new Script("OP_DUP OP_HASH160
1b2da6ee52ac5cd5e96d2964f12a0241851f8d2a OP_EQUALVERIFY OP_CHECKSIG");
BitcoinAddress address = scriptPubKey.GetDestinationAddress(Network.Main);
Console.WriteLine("Bitcoin Address: {0}", address);
}
比特币地址:13Uhw9BmdaXbnjDXiEd4HU4yesj7kKjxCo
也可以从 ScriptPubKey 取回哈希值,产生一个比特币地址,就像我们在 Lesson1() 里面展示的那样。
public void Lesson3()
{
Script scriptPubKey = new Script("OP_DUP OP_HASH160
1b2da6ee52ac5cd5e96d2964f12a0241851f8d2a OP_EQUALVERIFY OP_CHECKSIG");
KeyId hash = (KeyId)scriptPubKey.GetDestination();
Console.WriteLine("Public Key Hash: {0}", hash);
BitcoinAddress address = new BitcoinAddress(hash, Network.Main);
Console.WriteLine("Bitcoin Address: {0}", address);
}
公钥哈希:1b2da6ee52ac5cd5e96d2964f12a0241851f8d2a
比特币地址:13Uhw9BmdaXbnjDXiEd4HU4yesj7kKjxCo
拾遗:公钥哈希值的产生过程使,先将公钥进行 SHA256 哈希计算,结果再进行 RIPEMD160 哈希计算,按高位优先记录最终结果。函数看起来是这样的: RIPEMD160(SHA256(pubkey))
那么现在你应该理解私钥、公钥、公钥哈希、比特币地址和 ScriptPubKey 的关系了。
私钥通常用 Base58Check 编码表示,叫做比特币密码(也叫钱包导入格式,简称 WIF),就像比特币地址那样。
本书的其余部分,你将使用自己产生的一个地址。
注意很容易就可以从比特币密码产生私钥。特别记住,从比特币地址产生公钥是不可能的,因为比特币地址含有公钥哈希但不是公钥本身。
public void Lesson4()
{
Key key = new Key();
BitcoinSecret secret = key.GetBitcoinSecret(Network.Main);
Console.WriteLine("Bitcoin Secret: {0}", secret);
}
比特币密码:KyVVPaNYFWgSCwkvhMG3TruG1rUQ5o7J3fX7k8w7EepQuUQACfwE
复制你得到的比特币密码,在 Program.cs 的 main 方法中添加如下代码,代替提供给你的密码。
BitcoinSecret paymentSecret = new
BitcoinSecret("KyVVPaNYFWgSCwkvhMG3TruG1rUQ5o7J3fX7k8w7EepQuUQACfwE");
练习:注意你自己产生的私钥将用于本身的其余部分,包括它的地址。
在本书的其余部分,我将自己的私钥存储在变量 BitcoinSecret paymentSecret 中。
练习:取得 paymentSecret 的比特币地址,存储到 paymentAddress,在 Bitcoin Core 上发送一些币到上面。比如 0.01 比特币,感到顺手的时候可以增加一些。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论