返回介绍

1.比特币地址

发布于 2024-12-29 22:37:17 字数 3911 浏览 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 比特币,感到顺手的时候可以增加一些。

发布评论

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