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比特币,感到顺手的时候可以增加一些。

results matching ""

    No results matching ""