比特币地址生成的流程
比特币地址是用于发送和接受币的,钱包可以生成地址,每一个地址对应了一个私钥,有了私钥就能操作地址上的币。一个地址的生成最开始是由一个种子生成私钥,然后私钥生成公钥,公钥生成地址,有了公钥是不能反推生成私钥,而保存好私钥,在任何时候都可以生成公钥,有了公钥当然也能生成地址。
通过公钥生成地址的方法是将公钥进行一次 sha256,再进行一次 RIPEMD160,再做一次 Base58Check 编码,最终得到的地址就是类似这种格式 155JJbE4SVrjQ1h8iGsSiTLUnRqFr8mSao,生成地址的公式如下:
1 2 |
address = base58check(ripemd160(sha256(publickey))) |
Base58 有些朋友可能不了解,但一定会知道 Base64,Base64 可以通过基础的 64 个可见的字符编码任何二进制数据,而 Base58 从原来的 Base64 的基础字符中减掉了 6 个,剩下的基础字符串如下:
1 2 |
123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz |
比特币地址生成的流程总结如下图所示:
下面我们来实际操作生成一个地址,下载 libbitcoin-explorer(又名 bx),这个工具可以帮助我们生成私钥、公钥、地址,还有可以支持各种 sha256、ripemd160、base58 等编码,如果你用的是 macOS 系统,可以输入下载的命令直接下载并安装
1 2 3 |
brew install bx brew link libbitcoin-explorer |
第一个步骤是生成私钥,生成私钥需要指定一个种子,这个种子你可以使用 bx 提供生成随机种子的方法
1 2 3 |
bx seed 06d67bacf53ce6c1e1a8309f0ca4d34c4448180989e474aa |
也可以自己指定种子,为了学习演示的方便,我们可以自定义一个简单的种子,但在真实情况使用千万不要太随意,否则太容易被人碰撞到私钥,比如我们测试用的种子全是 1,使用 ec-new 生成私钥,然后再使用 ec-to-public 通过私钥生成公钥,再使用 ec-to-address 通过公钥生成地址,最终得到的地址是 155JJbE4SVrjQ1h8iGsSiTLUnRqFr8mSao,操作步骤如下:
1 2 3 4 5 6 7 |
bx ec-new "111111111111111111111111111111111111111111111111" 69bac3b554a6464315a3023ebad58cf1cc8abbf5c735cda68f06bce608ff953b bx ec-to-public 69bac3b554a6464315a3023ebad58cf1cc8abbf5c735cda68f06bce608ff953b 0246c15dc356bd419dc297cd7c178fea2a10bfac8a0a2a33826b9602d2535a05a4 bx ec-to-address 0246c15dc356bd419dc297cd7c178fea2a10bfac8a0a2a33826b9602d2535a05a4 155JJbE4SVrjQ1h8iGsSiTLUnRqFr8mSao |
通过上面的操作,很方便的得到了地址,但是怎么没有 sha256 和 ripemd160,还有 base58 呢?别着急,下面我们尝试使用公钥一步步生成地址,公钥是 0246c15dc356bd419dc297cd7c178fea2a10bfac8a0a2a33826b9602d2535a05a4,首先使用 sha256,再使用 ripemd160 得到的结果是 2cb09c6c84654b22a54e8c142ef4370cbe9ebb72,然后再使用 base58check 编码得到的地址和第一次的完全一样,操作如下所示:
1 2 3 4 5 6 7 |
bx sha256 0246c15dc356bd419dc297cd7c178fea2a10bfac8a0a2a33826b9602d2535a05a4 b533eba7460321151266276429b03a7e09f9f95679a753d925dd00d64f116a3b bx ripemd160 b533eba7460321151266276429b03a7e09f9f95679a753d925dd00d64f116a3b 2cb09c6c84654b22a54e8c142ef4370cbe9ebb72 bx base58check-encode 2cb09c6c84654b22a54e8c142ef4370cbe9ebb72 155JJbE4SVrjQ1h8iGsSiTLUnRqFr8mSao |
base58check 和 base58 有什么区别呢?base58check 是先做一次 base58,然后在开头添加版本号和在未尾添加检验和,这样做是为了防止用户输错地址,一般的钱包软件都会计算数据的校验和对比用户的地址是否有效,避免造成资金的丢失。可以通过 base58check-decode 解码得到的信息如下,可以看到版本号是 0。
1 2 3 4 5 6 7 8 |
bx base58check-decode 155JJbE4SVrjQ1h8iGsSiTLUnRqFr8mSao wrapper { checksum 2628507585 payload 2cb09c6c84654b22a54e8c142ef4370cbe9ebb72 version 0 } |
在公钥开头添加版本号 00,然后计算两次 sha256,结果开头的4个字段是校验码 c1d7ab9c,将校验码添加到公钥末尾,执行 base58 最后生成的地址和第一次也是一样的。
1 2 3 4 5 6 7 |
bx sha256 002cb09c6c84654b22a54e8c142ef4370cbe9ebb72 3fda3c2e378e7a43eb6649bc776b69d223a53c22fba0855e0e7e0da602a9af36 bx sha256 3fda3c2e378e7a43eb6649bc776b69d223a53c22fba0855e0e7e0da602a9af36 c1d7ab9c919166b11aa869d29c5d9cc6b831cace97450bf0b217f743ae1377e9 bx base58-encode 002cb09c6c84654b22a54e8c142ef4370cbe9ebb72c1d7ab9c 155JJbE4SVrjQ1h8iGsSiTLUnRqFr8mSao |
转载请注明:exchen's blog » 比特币地址生成的流程