比特币学习之公钥和地址
公钥 公钥 公钥这个我们之前在第一节学习密码学中的 ECC 时就讲过了。私钥通过椭圆曲线公式得到
公钥
-
公钥
公钥这个我们之前在第一节学习密码学中的 ECC 时就讲过了。私钥通过椭圆曲线公式得到公钥
-
公钥哈希 —— 去缩短公钥

顾名思义,公钥哈希就是将公钥进行哈希所得的结果
公钥哈希的作用:
- 缩短的公钥的长度
- 又提供了一层安全层
公钥哈希的产生过程: 将公钥先后通过 SHA-256 和 RIPEMD-160 哈希函数就可得到公钥哈希

// 假设我们的公钥如下:
// publickey = 02b4632d08485ff1df2db55b9dafd23347d1c47a457072a1e87be26896549a8737
let publicKey = Buffer.from('02b4632d08485ff1df2db55b9dafd23347d1c47a457072a1e87be26896549a8737','hex')
function sha256(name){
var crypto = require('crypto');
var hash = crypto.createHash('sha256');
hash.update(name);
return hash.digest()
}
function ripemd160(name){
var crypto = require('crypto');
var hash = crypto.createHash('ripemd160');
hash.update(name);
return hash.digest()
}
console.log(ripemd160(sha256(publicKey)).toString('hex'))
// 输出结果
// '93ce48570b55c42c2af816aeaba06cfee1224fae'
地址

**地址:**地址是我们要给别人的东西,这样他就可以给我们发送比特币了。
当有人收到我们给的地址时,他可以根据地址的类型创建一个特定的锁定脚本。
-
我们如何创建一个地址呢?
要创建什么地址,取决于我们希望比特币如何被锁定。
但是通常来说,一个地址要包含以下几点:
- 要包含在锁定脚本中的一些特定数据,比如:公钥哈希
- 前缀(prefix),这将决定哪种锁定脚本
- 检验位(checksum),可以帮助我们检查是否在传输过程中出现错误。
最后我们将这些转成 Base58格式。
Base58 格式的数据非常适合保存和与他人的传输。
-
P2PKH中的地址
P2PKH中的地址:这是一个非常典型的地址,它将比特币锁定到一个公钥散列中
正如之前所说的,我们在公钥散列前添加前缀,在后添加校验和,最后再用base58编码。
然后,我们就可以将这个生成好的地址给别人了
-
前缀
正如之前所写的,我们可以使用前缀将指定要创建锁定脚本的类型。
以下是常见的地址前缀列表:
| Prefix | Locking Script | Leading Character | Example Address |-|-|-|- |00 | P2PKH | 1 | 1AKDDsfTh8uY4X3ppy1m7jw1fVMBSMkzjP |05 | P2SH | 3 | 34nSkinWC9rDDJiUY438qQN1JHmGqBHGW7 |6F | P2PKH (testnet)| m/n | ms2qxPw1Q2nTkm4eMHqe6mM7JAFqAwDhpB |C4 | P2SH (testnet) | 2 | 2MwSNRexxm3uhAKF696xq3ztdiqgMj36rJo
最后提供一个示例代码:
// 假设我们的公钥如下:
// public key: 021fa96c781e4ba8a11eb6fb8a7bd3f996ad0d6461fb403b0f389605c6f35c2620
const bitcoin = require('bitcoinjs-lib');
let publicKey=Buffer.from('021fa96c781e4ba8a11eb6fb8a7bd3f996ad0d6461fb403b0f389605c6f35c2620','hex');
const keyPair = bitcoin.ECPair.fromPublicKey(publicKey);
// 假设我们输出一个 P2PKH 中的地址 address
const { address } = bitcoin.payments.p2pkh({ pubkey: keyPair.publicKey });
console.log(address)
// 输出结果
// '1N9KfHtavP6nyjkErbsSx5bT7LCZA6CFM9'