开场白
前段时间断断续续了解了区块链的基本概念、 原理、技术等, 感觉大多数的文章都是千篇一律, 都是介绍区块链就是使用了钱包使用了非对称加密算法, 挖矿使用了pow、 pos、 dpos,网络使用了去中心化得p2p, 存储使用了区块, 还有什么零知识证明、 闪电网络、 侧链等新技术, 感觉都是复制粘贴转载了白皮书的介绍,吹嘘使用的技术多么流弊, 带着币圈的浮躁, 感觉似乎已经能颠覆世界, 但潜心研究区块链技术的文章太少。 空谈误国, 实干兴邦, 基哥只希望潜心探索区块链, 一层层拨开区块链神秘的乌沙, 把各种神秘的技术用技术的语言解释记录下来。
钱包地址
对区块链有基本了解的应该都知道钱包使用的最多的词就是公钥、 私钥、 地址。
- 私钥相当于钱包的钥匙
- 公钥相当于银行卡
- 地址相当于银行卡号
私钥和公钥是使用非对称加密生成, 比特币使用的是椭圆曲线算法。
地址是使用公钥作为payload用哈希算法生成的散列值再用base58加密展示。
相关的基本概念网上有很多通俗易懂的解释,这里主要解释比特币地址生成的过程。
- 使用公钥进行信息摘要处理, 比特币使用的是双哈希也叫哈希160, 先使用SHA256再使用RIPEMD160处理生成digest
-
对生成的摘要使用base58check进行encoding, base58check带有校验功能, 流程如图所示
image.png
-
首先对生成的摘要加上version prefix, 参考文献wiki上有version的定义, 钱包地址使用的是0
image.png
-
使用两次SHA256生成信息摘要并取前4个字节作为校验码checksum
-
拼接version+payload+checksum
-
使用base58加密算法生成地址
以上的各个步骤会用python代码解释
from secp256k1 import PrivateKey, PublicKey
from binascii import hexlify, unhexlify
import hashlib
import base58
#生成私钥公钥
privkey = PrivateKey()
pri_key = privkey.serialize()
print "pri_key: %s" % pri_key
pub_key = hexlify(privkey.pubkey.serialize())
print "pub_key: %s" % pub_key
#使用sha256 对公钥进行第一次哈希处理
intermed = hashlib.sha256(unhexlify(pub_key)).digest()
#使用ripemd160 对sha256生成的摘要进行第二次哈希处理
digest = hashlib.new('ripemd160', intermed).digest()
#根据比特币的定义钱包地址的version为0, 再payload之前加上
payload = chr(0) + digest
#对payload进行2次sha256的哈希处理, 并取前面4个字节作为校验码
checksum = hashlib.sha256(hashlib.sha256(payload).digest()).digest()[:4]
#把checksum拼接在payload的尾部
payload = payload +checksum
#使用base58进行加密处理
addr = base58.b58encode(payload)
print "wallet addr: %s" % addr
运行结果
pri_key: 309ab3a4e26be042196a66f45d787d45feff36e32eccfb875e0464191fb8565d
pub_key: 02bafbedeea575352c209ac4fa1930bcf2bb8051acca9f2fabe777517fa6b92e3f
wallet addr: 1JB5evkY74A2JhHiNUqUm9v1x4uN43WE8v
参考文献
Technical background of version 1 Bitcoin addresses
Base58Check encoding
Private key
网友评论