本文背景導(dǎo)入私鑰生成錢包 (私鑰 => 公鑰 => 地址)
以太坊地址的生成過程如下:
- 由
secp256k1曲線生成私鑰,是由32字節(jié)的隨機數(shù)生成
- 采用橢圓曲線數(shù)字簽名算法(ECDSA)將私鑰(32字節(jié))映射成公鑰(65字節(jié))。
- 公鑰(去掉04后剩下64字節(jié))經(jīng)過Keccak-256單向散列函數(shù)變成了32字節(jié),然后取后20字節(jié)并加上0x作為前綴所得就是ETH地址
公鑰 =>地址
- 從公鑰開始(128個字符/ 64個字節(jié))
- 使用公鑰的
Keccak-256哈希。您現(xiàn)在應(yīng)該有一個64個字符/ 32個字節(jié)的字符串。(注意:SHA3-256最終成為標(biāo)準(zhǔn),但以太坊使用Keccak)
- 取這個公鑰的最后40個字符/ 20個字節(jié)(Keccak-256)。或者,換句話說,刪除前24個字符/ 12個字節(jié)。這40個字符/ 20個字節(jié)是地址。當(dāng)前綴為0x時,它變?yōu)?2個字符長。
NSString *private = @"eef393f053a9e3a05a7a04deb5d49862ba9c043a0cb0d4a931817be6bd933435";
NSData *privateData = private.my_dataFromHexString;
//獲取公鑰
NSMutableData *publicKeyData = [[NSMutableData alloc] initWithLength:65];
ecdsa_get_public_key65(&secp256k1, privateData.bytes, publicKeyData.mutableBytes);
//045984b7 69b78391 11932745 cb1eb1f3 a19c18fe 0c8cd585 2681173b 3fed97ec 07c9ef76 727a3da4 19d2a658 413626c0 70aaa383 cf29dbc8 54a89fa2 c6128568 19
//截掉第一個字節(jié)04
NSData *subPublicKeyData = [publicKeyData subdataWithRange:NSMakeRange(1, publicKeyData.length - 1)];
//SHA3 KECCAK-256 哈希 單向散列函數(shù)變成了32字節(jié)
NSMutableData *secureData = [[NSMutableData alloc] initWithLength:256 / 8];
SHA3_CTX context;
keccak_256_Init(&context);
keccak_Update(&context, subPublicKeyData.bytes, (size_t)subPublicKeyData.length);
keccak_Final(&context, secureData.mutableBytes);
CC_XZEROMEM(&context, sizeof(SHA3_CTX));
//e75e4fbf 6e739c44 6c454f54 4ccc6fab 6f01ada8 c155ae8e c12e5487 aee5a972
//刪除前24個字符/ 12個字節(jié) 并拼接0x
NSData *addressData = [secureData subdataWithRange:NSMakeRange(12, secureData.length - 12)];
//核查地址中字母大小寫
Address *addres = [Address addressWithData:addressData];
//地址:0x4CCC6FaB6f01ADa8C155aE8EC12E5487aeE5a972
demo
相關(guān)
Etherscan API
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。