返回介绍

1.比特币地址

发布于 2024-12-29 22:37:17 字数 3911 浏览 0 评论 0 收藏 0

你的比特币地址是用来接收别人付款的。你也许知道,钱包软件使用私钥来付款。

一个比特币地址由两部分组成,一部分是公钥哈希值经过 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文