关于区块链钱包私钥碰撞概率计算分析
各种货币的钱包地址是唯一的吗?
先说结论:一种算法内,钱包地址是唯一的。两种不同的算法可以用不同的私钥生同相同的公钥。但是两者之间毫无关系。所以,另一种币的钱包地址和你的ustd钱包地址一致,基本上也没什么关系。但是,如果你说的另一种币加密算法和ustd是一致的,那么就意唯着你的私钥也是他的私钥,你们双方都可以操作对方的账户。这就意味着你们两人在生成私钥的时候,生成了一个一模一样的,嗯~~,这种概率无限趋近于零。
早在区块链出现的时候,大家就知道一种破解钱包的方法,就是私钥碰撞。你可以拿一台电脑,一直生成钱包地址,万一生成出了一个和现在公链上已经存在的钱包地址,那就意味着碰撞成功,万一这个钱包里面有很多很多的数字货币,那你就发财了。碰撞成功概率有多少呢?以比特币为例:
已知比特币私钥总数为2^256个。假设地球74亿人每人拥有100个有余额的私钥,那么随机生成一个私钥,刚好碰撞成功的概率是6.42*(10^-68),可以忽略不计~
最后补充一个基础知识:
所有区块链的钱包的地址都是非对称加密算法的公钥,与之对应的是一个私钥。简单来说,就是一对密码,他们通过一个算法,可以相互解密对方加密的信息。然后把其中一个密码公布出去(放在公链上)让谁都能得到,撑握私钥的你就可以发起交易了,你发起的交易任何人拿公钥都可以解密验证,所以可以证明这个交易是真实的体现了你的意愿。
公钥和私钥的生成靠的是随机算法,因为生成范围无限大,所以虽然理论有可能生成出相同的公私钥,但是概率无限趋近于零。
什么是区块链钱包
这是一个储存加密货币资产的工具,可以理解为银行账户。区块链钱包可以让用户查看余额、发送交易、接收资金等等。更具体地说,加密货币钱包本身不持有任何加密货币,它们持有的是加密货币的私钥。
什么是私钥
私钥就像是你的银行卡密码,它是由大小写字母和数字组成的编码,长度与区块链类型有关。你可以通过私钥推导出公钥。
什么是公钥
公钥可以对外公开,人们可以向你的公钥转账,就好比别人可以向你的银行账户打款一样。
私钥碰撞
既然每一个私钥都对应了一个钱包账户,那我们能不能通过随机生成私钥,来碰撞到有存储加密货币的钱包呢?
说干就干,咱们随便写一个多线程随机生成私钥并检查余额的程序来试试
from web3 import Web3
from loguru import logger
import binascii, os
import threading
import time
def generate_private_key():
return binascii.b2a_hex(os.urandom(32)).decode('utf8')
# 初始化 Web3
# 这里用alechemy提供的接口来连接Ethereum 节点
http_provider = Web3.HTTPProvider('https://eth-mainnet.g.alchemy.com/v2/YOUR-PROJECT-ID')
web3 = Web3(http_provider)
# ABI
abi = """
[
{
"constant": true,
"name": "balanceOf",
"outputs": [{"name": "", "type": "uint256", "value": "2000000000"}],
"inputs": [{"name": "_owner", "type": "address"}],
"anonymous": false,
"type": "function"
}
]
"""
# 智能合同地址和对应的单位
contracts_info = {
'USDT': {
'address': "0xdAC17F958D2ee523a2206206994597C13D831ec7",
'decimal': 10**6
},
'USDC': {
'address': "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
'decimal': 10**6
},
'Dfyn': {
'address': "0x9695e0114e12c0d3a3636fab5a18e6b737529023",
'decimal': 10**18
},
'BigTime': {
'address': "0x64bc2ca1be492be7185faa2c8835d9b824c8a194",
'decimal': 10**18
},
'MANA': {
'address': "0x0F5D2fB29fb7d3CFeE444a200298f468908cC942",
'decimal': 10**18
}
}
# 存有所有的合约实例
contracts = {}
# 创建所有的合约实例
for token, contract_info in contracts_info.items():
contracts[token] = {
'contract': web3.eth.contract(address=web3.to_checksum_address(contract_info['address']), abi=abi),
'decimal': contract_info['decimal']
}
try:
latest_block = web3.eth.block_number
logger.success(f'Web3 成功连接!最新的区块编号是: {latest_block}')
except Exception as e:
logger.error('Web3连接失败!')
logger.error(str(e))
# 创建一个线程锁
lock = threading.Lock()
def task():
while True:
try:
myPrivateKey = generate_private_key()
myAccount = web3.eth.account.from_key(myPrivateKey)
wallet_address = web3.to_checksum_address(myAccount.address)
# 请求会继续尝试直到成功
while True:
try:
# 查询ETH余额
balance_wei = web3.eth.get_balance(wallet_address)
balance_eth = web3.from_wei(balance_wei, 'ether')
break # 如果请求成功则跳出循环
except Exception as e:
logger.error('Failed to query ETH balance. Retrying...')
time.sleep(0.5) # 暂停0.5秒再重试
# 查询 Token 余额
balances = dict()
non_zero_balance = False
for token, contract_info in contracts.items():
contract = contract_info['contract']
decimal = contract_info['decimal']
# 请求会继续尝试直到成功
while True:
try:
balance = contract.functions.balanceOf(wallet_address).call() / decimal
break # 如果请求成功则跳出循环
except Exception as e:
logger.error(f'Failed to query {token} balance. Retrying...')
time.sleep(0.5) # 暂停0.5秒再重试
balances[token] = balance
# 检查余额是否大于0
if balance > 0:
non_zero_balance = True
# 打印所有余额
logger.info(f'PrivateKey:{myPrivateKey},ETH:{balance_eth},' + ','.join([f'{token}:{balance}' for token, balance in balances.items()]))
# 如果余额大于0,加锁向文件追加数据
if non_zero_balance:
with lock:
logger.success(f'发现非空钱包,PrivateKey:{myPrivateKey},ETH:{balance_eth},' + ','.join([f'{token}:{balance}' for token, balance in balances.items()]))
with open('key.txt', 'a') as f:
f.write(f'PrivateKey:{myPrivateKey},ETH:{balance_eth},' + ','.join([f'{token}:{balance}' for token, balance in balances.items()]) + '\n')
except Exception as e:
logger.error('Error occurred. Retrying...')
continue
def main():
# 线程数量
logger.info('请输入线程数:')
num_threads = int(input())
for _ in range(num_threads):
t = threading.Thread(target=task)
t.start()
if __name__ == '__main__':
main()
程序运行截图
这个程序在开200个线程的情况下,一台服务器运行24小时大概能够查询上千万个私钥对应的钱包是否有以上几种加密货币。
因为是程序是联网查询的,所以速度上会稍微慢一些。如果想要优化查询速度的话,可以把所有有过交易记录的钱包地址都记录下来,然后拿私钥计算出来的钱包地址直接去和记录的钱包地址做比对(空间换时间),这样可以节省掉联网查询的耗时。
概率计算
我们假设全世界80亿人,每个人有2个区块链钱包,我们的程序一分钟能够计算1000万个私钥对应的钱包里是否有加密货币,我们放在服务器上计算一年,碰撞到持有加密货币的钱包地址的概率是多少呢?
区块链的钱包私钥通常是256位的,以十六进制来表示则为64个字符(一位十六进制 = 4位二进制),所以有效的私钥数量为 16^{64} ,接近 10^{77} 。
全世界80亿人( 8*10^{9} ),每个人有2个钱包里面有加密货币,所以总共有 1.6*10^{10} 个钱包。所以有加密货币钱包的概率是 1.6*10^{10}/10^{77} = 1.6*10^{-67} 。
程序每分钟能生成1000万( 10^{7} )个私钥,一小时就是( 60*10^{7} ),一年(假设为365天),就是 365*24*60*10^{7}=5.256*10^{12}
所以,一年的时间内,碰到一个持有加密货币的钱包地址的概率为 5.256*10^{12}*1.6*10^{-67}=8.4096*10^{-55}
这个概率是个什么概念呢?
双色球一等奖(猜中6个红球号码,以及蓝球的号码),中奖概率为1/17721088,约等于 5.64325*10^{-8} 。
如果我们将这两个概率进行比较,可以得到连续中双色球的次数为log( lg8.4096*10^{-55}/lg5.64325*10^{-8}\approx7.5 ^-51)。
也就是说碰撞到一个持有加密货币的钱包地址相当于连续7.5次中双色球一等奖。
这就是为什么人们称基于私钥的加密为安全的原因。私钥空间太大了,即使使用极其强大的计算能力,也不可能在有限的时间内通过生成检查所有可能的私钥的方法找到特定的私钥。
多签钱包
当你碰撞到了一个持有大量加密货币的钱包,其还有可能是多签钱包(Multisignature Wallet),一笔交易需要多个私钥的签名才能完成。即使你有一个私钥,也无法进行转账或交易。
在线手动碰撞
这是一个在线手动进行私钥碰撞的网页,可以根据私钥计算出公钥,也可以生成随机的公私钥对,并且点击链接能够直接跳转到 Etherscan 检查地址对应的余额。
你可能感兴趣的文章
-
加密货币空投有哪些类型?如何安全领取空投代币?完整指南
随着区块链技术的不断发展,空投(Airdrop)已成为加密项推广的重要式,简单来说,空投就是免费发放加密货币,的是吸引更多户关注项目并参与其中,对新来说,空投是种低槛的 …
2025-09-23 -
区块浏览器怎么用?怎么查看链上数据和转账状态?
区块浏览器是一种专门用于查询和浏览区块链信息的工具,本质上是区块链的 “搜索引擎”, 它能实时浏览和查询区块链上的区块高度、交易记录、地址、代币等信息,将复杂的链…
2025-09-23 -
2025年如何挖掘莱特币 (LTC)币?挖矿教程、收益分析
莱特币诞生于 2011 年,是比特币的一个分叉,旨在成为更轻量、更快速的支付网络,它采用 Scrypt 算法,这是一种不同于比特币 SHA-256 的哈希算法,最初的设计目的是降低挖矿…
2025-09-23 -
什么是跨链桥?市面上有哪些跨链桥?一文介绍
什么是跨链桥?跨链桥在加密货币领域发挥着至关重要的作用,它实现了不同区块链网络之间的资产转移,这是必要的,因为每个区块链都按照自己的规则独立运行,因此无法直接在…
2025-09-23 -
DeFi 3.0是什么?DeFi 3.0 代币、功能、工作原理介绍
去中心化金融 (DeFi) 已经彻底改变了人们对货币、借贷和投资的认知,从早期简单的借贷协议到如今高度复杂的收益挖矿方法,DeFi 不断发展演变,这种演变的最新阶段就是人们所…
2025-09-23 -
DePINFi是什么?有哪些分类?DePINFi的趋势的优势和挑战介绍
DePINFi 是“去中心化物理基础设施网络金融”的缩写,是去中心化物理基础设施网络 (DePIN) 与去中心化金融 (DeFi) 的交汇点,下面小编就为大家详细介绍一下它吧…
2025-09-22 -
Base生态核心项目有哪些?一文速览值得关注的20个Base生态项目
本文将推荐Base生态中值得关注的20个项目,通过梳理这些项目的市场定位和资本表现,来判断Base生态的真实厚度,并进一步揭示其未来增长的动力来源,这不仅是对Base App转型…
2025-09-22 -
一文盘点Web3 AI的11个潜力项目:不要错过的造富列车
Web3 AI为普通人提供了参与AI财富创造的机会,不同于传统AI的精英化,以下是我们精选的 Web3 AI领域最具潜力的项目和方向,Web3 AI的造富列车已经启动,现在上车还来得及…
2025-09-22 -
什么是加密货币完全稀释估值FDV?怎么算?为何代币解锁可能意味着上涨
什么是加密货币完全稀释估值FDV?为何代币解锁可能意味着上涨?FDV 考虑的是代币的总供应量,而流通供应量指的是当前市场上实际交易的代币,理解 FDV 有助于全面评估一个项…
2025-09-20 -
什么是加密货币市值?市值为何重要?如何影响加密货币价格?
市值,通常被称为“市值”,是一个反映加密货币总价值的财务指标,它是通过将加密货币的当前价格乘以其总流通供应量来计算的,本文深入探讨了加密货币市值的含义、计算方法以…
2025-09-19










