比特币采用椭圆曲线Secp256k1,“私钥”是1到n−1之间的随机数,n是个很大的数(256 个比特位),n 用科学计数法表示约为:
这个范围是极大的,我们是几乎无法猜出其他人的私钥的。这个随机整数私钥可以用 256 比特位表示,存在多种编码方式。如果使用WIF、WIF-compressed 形式的私钥是没有加密的,可以解码得到原始的那个“随机整数”。另一种方式是BIP38,提议用 AES 算法对私钥进行加密,这种方案得到的私钥以字符 6P 开头,这种私钥必须输入密码才能导入到各种比特币钱包中,这就是我们平时常用的私钥。
随后我们会利用椭圆曲线公式 K = kG,由私钥 k 来生成比特币的公钥 K,G为 Base Point,它是 secp256k1 的一个参数。可以得到 K 的两个坐标,就是公钥的两种表达方式,分别为“Uncompressed format”和“Compressed format”。
Uncompressed 形式,就是把两个坐标 x 和 y 直接连接在一起,再在前面加个 0x04 前缀即可;Compressed 形式,就是当 y 为偶数时,编码为 02 x,当 y 为奇数时,编码为 03 x;
比特币地址
比特币各种类型的地址如下图可示,共有四种表示方法:
1. Legacy (P2PKH)格式
范例:1Fh7ajXabJBpZPZw8bjD3QU4CuQ3pRty9u
地址以“1”开头,是比特币最初的地址格式,至今仍在使用。由公钥通过 Hash 计算后得到,也被称为P2PKH 是 Pay To PubKey Hash(付款至公钥哈希)的缩写。
2. Nested SegWit (P2SH)格式
范例:3KF9nXowQ4asSGxRRzeiTpDjMuwM2nypAN
地址以"3"开头,P2SH 是Pay To Script Hash(支付至脚本哈希)的缩写,它支持比Legacy 地址更复杂的功能。Nested P2SH,获取现有的P2SH地址(以“3”开头),并与SegWit地址一起封装。
3. Native SegWit (Bech32)格式
范例:bc1qf3uwcxaz779nxedw0wry89v9cjh9w2xylnmqc3
在BIP0173中提出了 bc1 开头的地址,它们是原生的隔离见证地址。Bech32编码的地址,是专为SegWit开发的地址格式。Bech32在2017年底在BIP173被定义,该格式的主要特点之一是它不区分大小写(地址中只包含0-9,az),因此在输入时可有效避免混淆且更加易读。由于地址中需要的字符更少,地址使用Base32编码而不是传统的Base58,计算更方便、高效。数据可以更紧密地存储在二维码中。Bech32提供更高的安全性,更好地优化校验和错误检测代码,将出现无效地址的机会降到最低。
Bech32地址本身与SegWit兼容。不需要额外的空间来将SegWit地址放入P2SH地址,因此使用Bech32格式地址,手续费会更低。Bech32地址比旧的Base58(Base58Check编码用于将比特币中的字节数组编码为人类可编码的字符串)地址有几个优点:QR码更小;更好地防错;更加安全;不区分大小写;只由小写字母组成,所以在阅读、输入和理解时更容易。
4. Taproot格式(P2TR)
Bech32 有个缺点:如果地址的最后一个字符是 p,则在紧接着 p 之前的位置插入或者删除任意数量的字符 q 都不会使其 checksum 失效。
为了缓解 Bech32 的上述缺点,在BIP0350中提出了 Bech32m 地址:
对于版本为 0 的原生隔离见证地址,使用以前的 Bech32;对于版本为 1(或者更高)的原生隔离见证地址,则使用新的 Bech32m。
对于 Bech32m 地址,当版本为 1 时,它们总是以bc1p开头(即 Taproot 地址)。具体来说,就像本地隔离见证一样,钱包可以由种子短语和密码短语组成。这些用于生成扩展的公钥和私钥,用于在分层确定性钱包中派生任意路径的地址。主要是储存BRC-20以及BTC的NFT等。