關(guān)于區(qū)塊鏈錢包私鑰碰撞概率計算分析
各種貨幣的錢包地址是唯一的嗎?
先說結(jié)論:一種算法內(nèi),錢包地址是唯一的。兩種不同的算法可以用不同的私鑰生同相同的公鑰。但是兩者之間毫無關(guān)系。所以,另一種幣的錢包地址和你的ustd錢包地址一致,基本上也沒什么關(guān)系。但是,如果你說的另一種幣加密算法和ustd是一致的,那么就意唯著你的私鑰也是他的私鑰,你們雙方都可以操作對方的賬戶。這就意味著你們兩人在生成私鑰的時候,生成了一個一模一樣的,嗯~~,這種概率無限趨近于零。
早在區(qū)塊鏈出現(xiàn)的時候,大家就知道一種破解錢包的方法,就是私鑰碰撞。你可以拿一臺電腦,一直生成錢包地址,萬一生成出了一個和現(xiàn)在公鏈上已經(jīng)存在的錢包地址,那就意味著碰撞成功,萬一這個錢包里面有很多很多的數(shù)字貨幣,那你就發(fā)財了。碰撞成功概率有多少呢?以比特幣為例:
已知比特幣私鑰總數(shù)為2^256個。假設(shè)地球74億人每人擁有100個有余額的私鑰,那么隨機生成一個私鑰,剛好碰撞成功的概率是6.42*(10^-68),可以忽略不計~
最后補充一個基礎(chǔ)知識:
所有區(qū)塊鏈的錢包的地址都是非對稱加密算法的公鑰,與之對應(yīng)的是一個私鑰。簡單來說,就是一對密碼,他們通過一個算法,可以相互解密對方加密的信息。然后把其中一個密碼公布出去(放在公鏈上)讓誰都能得到,撐握私鑰的你就可以發(fā)起交易了,你發(fā)起的交易任何人拿公鑰都可以解密驗證,所以可以證明這個交易是真實的體現(xiàn)了你的意愿。
公鑰和私鑰的生成靠的是隨機算法,因為生成范圍無限大,所以雖然理論有可能生成出相同的公私鑰,但是概率無限趨近于零。
什么是區(qū)塊鏈錢包
這是一個儲存加密貨幣資產(chǎn)的工具,可以理解為銀行賬戶。區(qū)塊鏈錢包可以讓用戶查看余額、發(fā)送交易、接收資金等等。更具體地說,加密貨幣錢包本身不持有任何加密貨幣,它們持有的是加密貨幣的私鑰。
什么是私鑰
私鑰就像是你的銀行卡密碼,它是由大小寫字母和數(shù)字組成的編碼,長度與區(qū)塊鏈類型有關(guān)。你可以通過私鑰推導出公鑰。
什么是公鑰
公鑰可以對外公開,人們可以向你的公鑰轉(zhuǎn)賬,就好比別人可以向你的銀行賬戶打款一樣。
私鑰碰撞
既然每一個私鑰都對應(yīng)了一個錢包賬戶,那我們能不能通過隨機生成私鑰,來碰撞到有存儲加密貨幣的錢包呢?
說干就干,咱們隨便寫一個多線程隨機生成私鑰并檢查余額的程序來試試
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 節(jié)點 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" } ] """ # 智能合同地址和對應(yīng)的單位 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 = {} # 創(chuàng)建所有的合約實例 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 成功連接!最新的區(qū)塊編號是: {latest_block}') except Exception as e: logger.error('Web3連接失敗!') logger.error(str(e)) # 創(chuàng)建一個線程鎖 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) # 請求會繼續(xù)嘗試直到成功 while True: try: # 查詢ETH余額 balance_wei = web3.eth.get_balance(wallet_address) balance_eth = web3.from_wei(balance_wei, 'ether') break # 如果請求成功則跳出循環(huán) 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'] # 請求會繼續(xù)嘗試直到成功 while True: try: balance = contract.functions.balanceOf(wallet_address).call() / decimal break # 如果請求成功則跳出循環(huán) 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,加鎖向文件追加數(shù)據(jù) if non_zero_balance: with lock: logger.success(f'發(fā)現(xiàn)非空錢包,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(): # 線程數(shù)量 logger.info('請輸入線程數(shù):') num_threads = int(input()) for _ in range(num_threads): t = threading.Thread(target=task) t.start() if __name__ == '__main__': main()
程序運行截圖
這個程序在開200個線程的情況下,一臺服務(wù)器運行24小時大概能夠查詢上千萬個私鑰對應(yīng)的錢包是否有以上幾種加密貨幣。
因為是程序是聯(lián)網(wǎng)查詢的,所以速度上會稍微慢一些。如果想要優(yōu)化查詢速度的話,可以把所有有過交易記錄的錢包地址都記錄下來,然后拿私鑰計算出來的錢包地址直接去和記錄的錢包地址做比對(空間換時間),這樣可以節(jié)省掉聯(lián)網(wǎng)查詢的耗時。
概率計算
我們假設(shè)全世界80億人,每個人有2個區(qū)塊鏈錢包,我們的程序一分鐘能夠計算1000萬個私鑰對應(yīng)的錢包里是否有加密貨幣,我們放在服務(wù)器上計算一年,碰撞到持有加密貨幣的錢包地址的概率是多少呢?
區(qū)塊鏈的錢包私鑰通常是256位的,以十六進制來表示則為64個字符(一位十六進制 = 4位二進制),所以有效的私鑰數(shù)量為 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} ),一年(假設(shè)為365天),就是 365*24*60*10^{7}=5.256*10^{12}
所以,一年的時間內(nèi),碰到一個持有加密貨幣的錢包地址的概率為 5.256*10^{12}*1.6*10^{-67}=8.4096*10^{-55}
這個概率是個什么概念呢?
雙色球一等獎(猜中6個紅球號碼,以及藍球的號碼),中獎概率為1/17721088,約等于 5.64325*10^{-8} 。
如果我們將這兩個概率進行比較,可以得到連續(xù)中雙色球的次數(shù)為log( lg8.4096*10^{-55}/lg5.64325*10^{-8}\approx7.5 ^-51)。
也就是說碰撞到一個持有加密貨幣的錢包地址相當于連續(xù)7.5次中雙色球一等獎。
這就是為什么人們稱基于私鑰的加密為安全的原因。私鑰空間太大了,即使使用極其強大的計算能力,也不可能在有限的時間內(nèi)通過生成檢查所有可能的私鑰的方法找到特定的私鑰。
多簽錢包
當你碰撞到了一個持有大量加密貨幣的錢包,其還有可能是多簽錢包(Multisignature Wallet),一筆交易需要多個私鑰的簽名才能完成。即使你有一個私鑰,也無法進行轉(zhuǎn)賬或交易。
在線手動碰撞
這是一個在線手動進行私鑰碰撞的網(wǎng)頁,可以根據(jù)私鑰計算出公鑰,也可以生成隨機的公私鑰對,并且點擊鏈接能夠直接跳轉(zhuǎn)到 Etherscan 檢查地址對應(yīng)的余額。
你可能感興趣的文章
-
以太坊還能漲嗎?從技術(shù)和基本面幫你看懂真相
上一周以太坊實現(xiàn)26.4%的周漲幅, 一舉突破2800的壓力位, 沖刺至4000大關(guān)腳下,以太坊還能漲嗎?下文將從以太坊的基本面以及技術(shù)面價格走勢來分析過去一周以及今年以來的以太…
2025-07-28 -
區(qū)塊鏈究竟是什么?原理、應(yīng)用、投資風險以及未來趨勢解析
區(qū)塊鏈究竟是什么?區(qū)塊鏈簡單說,就是一種建立在線上的去中心化的數(shù)位帳本技術(shù),能確保交易數(shù)據(jù)安全透明,且不可篡改,這種技術(shù)不僅應(yīng)用于比特幣,還被廣泛應(yīng)用于供應(yīng)鏈管…
2025-07-28 -
加密貨幣中鏈上與鏈下交易主要區(qū)別是什么?
加密領(lǐng)域的鏈上交易是指直接在區(qū)塊鏈上執(zhí)行的轉(zhuǎn)賬,鏈下交易最初繞過區(qū)塊鏈驗證,最終確認后再記錄在鏈上,從而提高速度并降低成本,鏈下流程的用戶允許受信任的第三方處理交…
2025-07-28 -
ChatGPT怎么用?ChatGPT AI 在加密交易中的5 個實際應(yīng)用案例
加密貨幣交易面臨獨特的挑戰(zhàn):海量的數(shù)據(jù)流、迅速的市場變動和情緒決策陷阱,雖然技術(shù)分析和基本面研究依然至關(guān)重要,但現(xiàn)在許多交易者已經(jīng)開始利用像ChatGPT 這樣的AI 工具…
2025-07-28 -
什么是Linea?如何運作?ConsenSys 推出的以太坊Layer-2 網(wǎng)絡(luò)?
什么是Linea?如何運作?作為第二大公有區(qū)塊鏈,以太坊's 網(wǎng)絡(luò)仍然面臨著高昂的Gas 費用、慢速交易速度和有限的吞吐量,尤其是在需求高峰時,進入Linea,一個由以太坊Layer-…
2025-07-28 -
什么是云算力?如何運作?挖礦加密貨幣的簡單指南
在不斷發(fā)展的加密貨幣世界中,挖礦長期以來被視為推動區(qū)塊鏈網(wǎng)絡(luò)的最基本過程之一,然而,隨著挖礦變得越來越具競爭性和資源密集型,許多人開始轉(zhuǎn)向一種更為便捷的替代方案…
2025-07-28 -
TRON是什么?最快、最便宜的USDT網(wǎng)絡(luò)的構(gòu)建介紹
2025年7月,波場TRON掀起波瀾,其原生代幣TRX一度超越卡爾達諾的ADA,成為市值第九大的加密貨幣,這一里程碑不僅體現(xiàn)在波場TRON市值飆升至298億美元,還體現(xiàn)在該公司在納斯…
2025-07-28 -
什么是去中心化應(yīng)用 (dApp)?dApp的優(yōu)勢、缺點、用途是什么介紹
去中心化應(yīng)用程序dApps是在點對點P2P或區(qū)塊鏈網(wǎng)絡(luò)上運行的軟件,而不是在單個服務(wù)器或集中式計算機上運行,在區(qū)塊鏈技術(shù)和智能合約的支持下,dApp提供了增強的安全性、透明…
2025-07-28 -
Monad是什么?Monad主網(wǎng)發(fā)布日期和空投是什么時候?
Monad是一個高性能 Layer1區(qū)塊鏈,旨在徹底革新以太坊兼容性,Monad的主網(wǎng)發(fā)布日期為2025年9月30日,代幣指標如下:MON的總發(fā)行量和最大發(fā)行量均為1000億,盡管 Monad Labs尚…
2025-07-27 -
正向合約和反向合約是什么?兩者有什么區(qū)別?各有什么優(yōu)勢?
在永續(xù)合約市場中,合約一般分為正向合約和反向合約,正向合約在加密市場中也稱為USDT本位合約、穩(wěn)定幣合約,它以USDT為定價單位,而反向合約也稱為幣本位合約,反向合約則是…
2025-07-26