欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

當前位置:主頁 > 區(qū)塊鏈 > 錢包知識 > 通過私鑰創(chuàng)建以太坊錢包地址

區(qū)塊鏈錢包科普:如何通過私鑰創(chuàng)建以太坊錢包地址?

2021-12-13 12:09:03 | 來源: | 作者:Timur Badretdinov
這篇文章主要介紹了區(qū)塊鏈錢包科普:如何通過私鑰創(chuàng)建以太坊錢包地址的相關資料,希望這篇關于如何通過私鑰創(chuàng)建以太坊錢包地址的文章,能夠幫助到各位朋友對區(qū)塊鏈錢包原理的理解。

編者注:我們翻譯和出版與密碼學貨幣的私鑰、地址和錢包有關的內容,無非希望傳達清楚幾個要點:

1. 密碼學貨幣不同于傳統(tǒng)的銀行,你有很多工具可以生成一把私鑰來持有密碼學貨幣,既不需要向銀行申請,也不需要給誰報備,沒有任何人能阻止你擁有自己的私鑰和錢包;

2. 公鑰和用來接收轉賬的地址都是由私鑰使用單向的數(shù)學運算推導出來的,如果不信任現(xiàn)有的工具,你完全可以自己使用這些數(shù)學運算來生成地址;同時,公開地址不會產(chǎn)生安全問題,因為地址無法反推出公鑰,也無法反推出私鑰;

3. 使用第三方提供的服務時,弄清楚服務的性質,不要向任何人暴露自己的私鑰,并且定期備份。

區(qū)塊鏈錢包科普:如何通過私鑰創(chuàng)建以太坊錢包地址?

在本系列文章的第一篇中,我們得到了如下的比特幣私鑰:

60cf347dbc59d31c1358c8e5cf5e45b822ab85b79cb32a9f3d98184779a9efc2

編者注:這里沒有寫出私鑰的生成過程。簡單來說,私鑰就是一串隨機的十六進制字符串,為了安全(私鑰不暴露、不被他人重現(xiàn)出來),這串隨機數(shù)的生成環(huán)境應盡可能滿足隨機性、不可預測性、不可重現(xiàn)性。

所以,不要自己寫一串數(shù)字來當私鑰,因為你自以為的“隨機”往往并不怎么隨機,很不安全。

(理論上來說你確實可以自己連拋 256 次硬幣產(chǎn)生符合長度要求(64 位)的隨機數(shù),但還是很不推薦。)

在本文中,我們會演示使用這個私鑰來獲得公開地址,以及與該私鑰對應的以太坊錢包地址。

通過私鑰來獲得比特幣錢包地址的具體流程有些復雜,因此我們會描述簡化后的版本。我們需要使用一個哈希函數(shù)去獲得公鑰,還需要使用另一個函數(shù)去獲得地址。

現(xiàn)在,讓我們開始吧。

公鑰

這部分內容和之前討論比特幣的文章中所說的相同,所以如果你已經(jīng)讀完了,那么就可以跳過(除非你想要復習一下)。

首先,我們需要在私鑰上使用 ECDSA,即橢圓曲線數(shù)字簽名算法。橢圓曲線是通過 y² = x³ + ax + b 公式得出的,其中 a 和 b 可以自定義。橢圓曲線家族有很多知名并且廣泛應用的案例。比特幣使用了 secp256k1 曲線,關于橢圓曲線密碼學,如果你想了解更多,可以參考此文章。

以太坊使用了同樣的橢圓曲線,secp256k1,因此對于比特幣和以太坊來說,獲得公鑰的流程是相同的。

對私鑰作了 ECDSA 運算之后,我們得到了 64 字節(jié)的整數(shù),這是由兩個 32 字節(jié)的整數(shù)串聯(lián)組成,代表了橢圓曲線上某個點的 X 值和 Y 值。

在 Python 程序中,代碼顯示如下:

private_key_bytes = codecs.decode(private_key, ‘hex’)
# Get ECDSA public key
key = ecdsa.SigningKey.from_string(private_key_bytes, curve=ecdsa.SECP256k1).verifying_key
key_bytes = key.to_string()
key_hex = codecs.encode(key_bytes, ‘hex’)

注意:從上面的代碼可以看出,我使用了 ecdsa 模塊并通過編碼器解碼了私鑰。這樣寫更多是因為 Python 的關系,而與算法本身無關,為免誤解,讓我來好好解釋一下。

Python 語言中,至少有兩種數(shù)據(jù)類型可以保存私鑰和公鑰:“str”和“bytes”。前者對應的是 string(字符串),后者則是 byte array(數(shù)值)。Python 語言中的密碼學運算只能對“bytes”類操作,將 byte 型數(shù)據(jù)作為輸入,并且將輸出作為結果。

但是,這里面有個小問題:作為字符串的“4f3c”和作為 byte array 的 4f3c 是不等同的,string 等于 byte array 和兩個元素 O< 的結合。codecs.decode 方法就是將字符串轉換為 byte array。本文中使用的密碼學操作都要進行這一步驟。

錢包地址

一旦獲得公鑰,我們就可以計算出錢包地址,和比特幣不同,以太坊在主網(wǎng)和所有測試網(wǎng)都有相同的地址。當用戶發(fā)起轉賬和簽名的時候,他們需要選擇相應的網(wǎng)絡。

為了通過公鑰得出地址,我們需要做的就是在公鑰上應用 Keccak-256 加密算法,然后拿出結果的后 20 個字節(jié),這樣就可以了。整個過程不需要其他的哈希函數(shù),無需 Base58 編碼,也不用其他任何轉換,你唯一需要做的事情就是在地址的開頭添加“0x”。

Python代碼如下:

public_key_bytes = codecs.decode(public_key, ‘hex’)
keccak_hash = keccak.new(digest_bits=256)
keccak_hash.update(public_key_bytes)
keccak_digest = keccak_hash.hexdigest()
# Take the last 20 bytes
wallet_len = 40
wallet = ‘0x’ + keccak_digest[-wallet_len:]

校驗和(checksum)

我們都知道,比特幣是對公鑰使用哈希算法,然后取結果的前 4 個數(shù)字,以此創(chuàng)建校驗和。這對于所有比特幣地址來說都是適用的,因此在沒有添加 checksum 字節(jié)之前,用戶無法獲得有效地址。

編者注:校驗和(checksum)是一種較為簡單的驗證數(shù)據(jù)完整性的方法,具體方法有很多種,比如說對一段數(shù)據(jù)逐次取 4 個比特,把取出的數(shù)全部加起來,最后得到一個 4 個比特的值作為校驗和。如果兩段數(shù)據(jù)不一樣,產(chǎn)生的校驗和有極大概率是不一樣的。跟哈希函數(shù)的原理有相似之處,但夠不上密碼學哈希函數(shù)那樣的強度。)

例:

MD5(cvsoiu687y0adbfiq7et5tgho0) = a277a316d38c21786eac518b83af898f

MD5(wysoiu687y0adbfiq7et5tgho0) = becd314fb8d277cfe20aaadc2b52c177

在以太坊中,產(chǎn)生地址的流程與此并不相同。最初的時候,以太坊中沒有校驗和這樣的機制來驗證秘鑰的完整性。但是在 2016 年,Vitalik Buterin 引進了 checksum 機制,現(xiàn)在已經(jīng)被錢包提供商和交易所使用。

在以太坊錢包地址上添加 checksum 使得我們可以通過大小寫來校驗地址的有效性。

首先,你需要獲得地址的 Keccak-256 哈希值。注意,將地址放入哈希函數(shù)的時候不可以添加 0x 部分。

其次,你需要迭代初始地址的字符,如果哈希值中的第 i 個字節(jié)(byte)大于或者等于 8,那么你要將地址中的第 i 個字符變?yōu)榇髮?,否則就還是保持小寫。

最后,你需要把 0x 添加到結果的開頭。如果忽略大小寫,那么校驗和地址與初始地址是相同的。但是,這種使用大寫字母的做法讓人們可以隨時隨地檢查地址是否有效。你可以通過這個網(wǎng)頁找到有效驗證 checksum 的算法。

通過 checksum 驗證方法,我們可以得到下面的結論:

“平均來看每個地址有 15 個校驗位,并且隨機得出的錯誤地址能夠偶然通過檢驗的概率為 0.0247%。”

下面是將 checksum 添加到以太坊地址的代碼:

checksum = ‘0x’
# Remove ‘0x’ from the address
address = address[2:]
address_byte_array = address.encode(‘utf-8’)
keccak_hash = keccak.new(digest_bits=256)
keccak_hash.update(address_byte_array)
keccak_digest = keccak_hash.hexdigest()
for i in range(len(address)):
address_char = address[i]
keccak_char = keccak_digest[i]
if int(keccak_char, 16) >= 8:
checksum += address_char.upper()
else:
checksum += str(address_char)

結論

如文中所述,和比特幣相比,創(chuàng)建以太坊地址要容易地多。我們需要做的事情就是用私鑰在 ECDSA 上找出公鑰,然后使用 Keccak-256 算法,并以最終哈希值的后 20 個字節(jié)作為地址。

區(qū)塊鏈錢包科普:如何通過私鑰創(chuàng)建以太坊錢包地址?

如果你想使用這些代碼,我已經(jīng)把它們發(fā)布到這個 GitHub repository 上了.

編者注:如上圖所示,以太坊的公鑰和地址都由私鑰生成,并且其生成所需的數(shù)學運算都是完全公開的。

以上就是區(qū)塊鏈錢包科普:如何通過私鑰創(chuàng)建以太坊錢包地址的詳細內容,更多關于通過私鑰創(chuàng)建以太坊錢包地址的資料請關注腳本之家其它相關文章!

免責聲明:本文只為提供市場訊息,所有內容及觀點僅供參考,不構成投資建議,不代表本站觀點和立場。投資者應自行決策與交易,對投資者交易形成的直接或間接損失,作者及本站將不承擔任何責任。!

你可能感興趣的文章

更多

熱門幣種

  • 幣名
    最新價格
    24H漲幅
  • bitcoin BTC 比特幣

    BTC

    比特幣

    $ 106363.28¥ 757189.55
    +3.91%
  • ethereum ETH 以太坊

    ETH

    以太坊

    $ 3608.76¥ 25690.4
    +4.49%
  • tether USDT 泰達幣

    USDT

    泰達幣

    $ 0.9996¥ 7.116
    -0.01%
  • ripple XRP 瑞波幣

    XRP

    瑞波幣

    $ 2.553¥ 18.1745
    +11.99%
  • binance-coin BNB 幣安幣

    BNB

    幣安幣

    $ 1000.49¥ 7122.38
    +1.6%
  • solana SOL Solana

    SOL

    Solana

    $ 169.29¥ 1205.15
    +6.12%
  • usdc USDC USD Coin

    USDC

    USD Coin

    $ 1.0001¥ 7.1196
    +0.01%
  • tron TRX 波場

    TRX

    波場

    $ 0.2949¥ 2.0993
    +1.72%
  • dogecoin DOGE 狗狗幣

    DOGE

    狗狗幣

    $ 0.1825¥ 1.2991
    +3.75%
  • cardano ADA 艾達幣

    ADA

    艾達幣

    $ 0.596¥ 4.2428
    +5.71%

幣圈快訊

  • 貝萊德于1小時前向Coinbase存入1271枚BTC

    2025-11-10 21:27
    據(jù)OnchainLens監(jiān)測,貝萊德現(xiàn)貨ETF地址于1小時前向Coinbase存入了1,271枚比特幣,價值1.3467億美元。
  • 國際商業(yè)結算控股有限公司上周收購247.8694枚比特幣

    2025-11-10 21:27
    國際商業(yè)結算控股有限公司:10月17日至11月7日期間收購247.8694枚比特幣,價值2570萬美元。
  • 巴西央行宣布加密貨幣市場運營的新規(guī)則

    2025-11-10 21:27
    巴西央行宣布加密貨幣市場運營的新規(guī)則。
  • Sui生態(tài)DEXBluefin融資200萬瑞士法郎,SUIGroup參投

    2025-11-10 21:26
    納斯達克上市公司SUIGroup宣布對Sui生態(tài)去中心化交易所Bluefin投資200萬瑞士法郎(約合250萬美元),雙方將合作將對沖基金、資產(chǎn)管理公司和做市商引入鏈上市場。
  • 貝萊德向Coinbase存入1,271枚比特幣

    2025-11-10 21:22
    據(jù)鏈上分析師OnchainLens(@OnchainLens)監(jiān)測,貝萊德向Coinbase存入1,271枚比特幣,價值1.3467億美元。
  • 查看更多