摘要:公鑰上面生成的密鑰的公共部分被編碼為比特幣地址。使用對(duì)地址進(jìn)行編碼我們現(xiàn)在使用庫(kù)中的方法來(lái)獲得最終的比特幣地址。這是比特幣應(yīng)在交易中發(fā)送到的地址。這是一個(gè)如何在中生成比特幣地址的演示文稿。
讓我們通過(guò)學(xué)習(xí)比特幣(Bitcoin)如何實(shí)施該技術(shù)的各個(gè)方面來(lái)工作,好嗎?該技術(shù)包括以下幾個(gè)方面:
比特幣地址bitcoin address是用來(lái)發(fā)送和接收比特幣的。
交易transaction是比特幣從一個(gè)地址轉(zhuǎn)移到另一個(gè)地址。
幾個(gè)交易被分組成一個(gè)區(qū)塊block。一個(gè)區(qū)塊被處理,因此它可以被提交到比特幣網(wǎng)絡(luò)中。這個(gè)過(guò)程被稱為挖礦mining。
區(qū)塊被收集在區(qū)塊鏈blockchain中,并由網(wǎng)絡(luò)中的節(jié)點(diǎn)共享。
警告的提示——這里的代碼僅用于學(xué)習(xí)。如果你試圖將比特幣發(fā)送到由該代碼生成的地址,你可能會(huì)損失金錢(qián)。
什么是比特幣地址?比特幣地址是一個(gè)隨機(jī)查找的十六進(jìn)制字符串,在比特幣網(wǎng)絡(luò)中用于發(fā)送和接收比特幣。它是公私不對(duì)稱ECDSA密鑰的公共部分。相應(yīng)的私鑰用于簽署比特幣交易,作為交易時(shí)來(lái)自你的確認(rèn)和證明。
從技術(shù)上講,比特幣地址是從ECDSA密鑰的公共部分生成的,使用SHA-256和RIPEMD-160進(jìn)行hash,如下文所述,處理得到的結(jié)果hash,最后使用Base58校驗(yàn)編碼對(duì)密鑰進(jìn)行編碼。
讓我們看看如何使用JCE(java加密擴(kuò)展),Bouncy Castle(RIPEMD-160)以及最后在bitcoinj庫(kù)中使用Base58編碼功能來(lái)完成所有這些工作。
生成ECDSA密鑰對(duì)我們之前已經(jīng)介紹過(guò)生成RSA公鑰和私鑰。比特幣使用ECDSA代替RSA作為關(guān)鍵算法。它生成如下:
為Elliptic Curve算法創(chuàng)建KeyPairGenerator。
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("EC");
使用指定橢圓曲線是secp256k1。
ECGenParameterSpec ecSpec = new ECGenParameterSpec("secp256k1"); keyGen.initialize(ecSpec);
一旦獲得KeyPairGenerator后,你可以創(chuàng)建KeyPair即密鑰對(duì),從中可以獲取公鑰和私鑰。
KeyPair kp = keyGen.generateKeyPair(); PublicKey pub = kp.getPublic(); PrivateKey pvt = kp.getPrivate();ECDSA私鑰
你可以只存儲(chǔ)密鑰的私有部分,因?yàn)楣€可以從私鑰派生。
ECPrivateKey epvt = (ECPrivateKey)pvt; String sepvt = adjustTo64(epvt.getS().toString(16)).toUpperCase(); System.out.println("s[" + sepvt.length() + "]: " + sepvt);
靜態(tài)方法adjustTo64()僅填充帶有前導(dǎo)0的十六進(jìn)制字符串,因此總長(zhǎng)度為64個(gè)字符。
static private String adjustTo64(String s) { switch(s.length()) { case 62: return "00" + s; case 63: return "0" + s; case 64: return s; default: throw new IllegalArgumentException("not a valid key: " + s); } }
這是由上面的代碼生成的示例私鑰。
s[64]: 024C8E05018319CED4BB04E184C307BFF115976A05F974C7D945B5151E490ADE
這個(gè)值通常是由數(shù)字錢(qián)包存儲(chǔ)的值。
ECDSA公鑰上面生成的密鑰的公共部分被編碼為比特幣地址。首先,ECDSA密鑰由橢圓曲線上的點(diǎn)表示。該點(diǎn)的X和Y坐標(biāo)包括公鑰。它們?cè)陂_(kāi)頭與“04”連接在一起代表公鑰。
ECPublicKey epub = (ECPublicKey)pub; ECPoint pt = epub.getW(); String sx = adjustTo64(pt.getAffineX().toString(16)).toUpperCase(); String sy = adjustTo64(pt.getAffineY().toString(16)).toUpperCase(); String bcPub = "04" + sx + sy; System.out.println("bcPub: " + bcPub); # prints bcPub: 04CAAA5C0BDDAA22C9D3C0DDAEC8550791891BB2C2FB0F9084D02F927537DE4F443ACED7DEB488E9BFE60D6C68596E6C78D95E20622CC05474FD962392BDC6AF29執(zhí)行SHA-256和RIPEMD-160哈希
我們現(xiàn)在需要在公鑰上執(zhí)行SHA-256,然后是RIPEMD-160。
MessageDigest sha = MessageDigest.getInstance("SHA-256"); byte[] s1 = sha.digest(bcPub.getBytes("UTF-8")); System.out.println(" sha: " + bytesToHex(s1).toUpperCase()); # prints sha: 7524DC35AEB4B62A0F1C90425ADC6732A7C5DF51A72E8B90983629A7AEC656A0
我們使用Bouncy Castle提供程序來(lái)執(zhí)行RIPEMD-160,因?yàn)?b>JCE沒(méi)有實(shí)現(xiàn)此算法。
MessageDigest rmd = MessageDigest.getInstance("RipeMD160", "BC"); byte[] r1 = rmd.digest(s1);
接下來(lái),我們需要在哈希開(kāi)頭添加一個(gè)0x00的版本字節(jié)。
byte[] r2 = new byte[r1.length + 1]; r2[0] = 0; for (int i = 0 ; i < r1.length ; i++) r2[i+1] = r1[i]; System.out.println(" rmd: " + bytesToHex(r2).toUpperCase()); # prints rmd: 00C5FAE41AB21FA56CFBAFA3AE7FB5784441D11CEC重復(fù)SHA-256哈希兩次
我們現(xiàn)在需要對(duì)上面的結(jié)果執(zhí)行兩次SHA-256哈希。
byte[] s2 = sha.digest(r2); System.out.println(" sha: " + bytesToHex(s2).toUpperCase()); byte[] s3 = sha.digest(s2); System.out.println(" sha: " + bytesToHex(s3).toUpperCase());
第二次散列結(jié)果的前4個(gè)字節(jié)用作地址校驗(yàn)和。它附加到上面的RIPEMD160哈希。這是25字節(jié)的比特幣地址。
byte[] a1 = new byte[25]; for (int i = 0 ; i < r2.length ; i++) a1[i] = r2[i]; for (int i = 0 ; i < 5 ; i++) a1[20 + i] = s3[i];使用Base58對(duì)地址進(jìn)行編碼
我們現(xiàn)在使用bitcoinj庫(kù)中的Base58.encode()方法來(lái)獲得最終的比特幣地址。
System.out.println(" adr: " + Base58.encode(a1)); # prints adr: 1K3pg1JFPtW7NvKNA77YCVghZRq2s1LwVF
這是比特幣應(yīng)在交易中發(fā)送到的地址。
這是一個(gè)如何在java中生成比特幣地址的演示文稿。我們生成一個(gè)ECDSA密鑰對(duì),使用SHA256和RIPEMD160哈希密鑰的公共部分。最后,我們通過(guò)執(zhí)行SHA256兩次并選取前4個(gè)字節(jié)來(lái)計(jì)算校驗(yàn)和,該字節(jié)附加到上面的RIPEMD160哈希。結(jié)果使用Base58編碼進(jìn)行編碼。
覺(jué)得有點(diǎn)復(fù)雜,也可以看這個(gè)Java離線生成比特幣地址
建議你瀏覽我們的各種編程語(yǔ)言的區(qū)塊鏈教程和區(qū)塊鏈技術(shù)博客,更深入了解區(qū)塊鏈,比特幣,加密貨幣,以太坊,和智能合約。
java比特幣開(kāi)發(fā)教程,本課程面向初學(xué)者,內(nèi)容即涵蓋比特幣的核心概念,例如區(qū)塊鏈存儲(chǔ)、去中心化共識(shí)機(jī)制、密鑰與腳本、交易與UTXO等,同時(shí)也詳細(xì)講解如何在Java代碼中集成比特幣支持功能,例如創(chuàng)建地址、管理錢(qián)包、構(gòu)造裸交易等,是Java工程師不可多得的比特幣開(kāi)發(fā)學(xué)習(xí)課程。
php比特幣開(kāi)發(fā)教程,本課程面向初學(xué)者,內(nèi)容即涵蓋比特幣的核心概念,例如區(qū)塊鏈存儲(chǔ)、去中心化共識(shí)機(jī)制、密鑰與腳本、交易與UTXO等,同時(shí)也詳細(xì)講解如何在Php代碼中集成比特幣支持功能,例如創(chuàng)建地址、管理錢(qián)包、構(gòu)造裸交易等,是Php工程師不可多得的比特幣開(kāi)發(fā)學(xué)習(xí)課程。
匯智網(wǎng)原創(chuàng)翻譯,轉(zhuǎn)載請(qǐng)標(biāo)明出處。這里是原文
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/24337.html
摘要:公鑰上面生成的密鑰的公共部分被編碼為比特幣地址。使用對(duì)地址進(jìn)行編碼我們現(xiàn)在使用庫(kù)中的方法來(lái)獲得最終的比特幣地址。這是比特幣應(yīng)在交易中發(fā)送到的地址。這是一個(gè)如何在中生成比特幣地址的演示文稿。 讓我們通過(guò)學(xué)習(xí)比特幣(Bitcoin)如何實(shí)施該技術(shù)的各個(gè)方面來(lái)工作,好嗎?該技術(shù)包括以下幾個(gè)方面: 比特幣地址bitcoin address是用來(lái)發(fā)送和接收比特幣的。 交易transaction...
摘要:創(chuàng)建比特幣錢(qián)包需要一組優(yōu)秀的程序員。如何使用流行的庫(kù)構(gòu)建自己的比特幣錢(qián)包應(yīng)用程序創(chuàng)建比特幣錢(qián)包應(yīng)用程序的一種方法是依賴現(xiàn)有工具。具有以下功能它允許開(kāi)發(fā)人員使用密碼加密創(chuàng)建比特幣錢(qián)包應(yīng)用程序。 盡管目前加密貨幣市場(chǎng)相當(dāng)黯淡,但比特幣和其他山寨幣繼續(xù)受歡迎。每天都有新的交易者加入市場(chǎng),希望能夠在下一個(gè)價(jià)格高漲時(shí)獲利。 隨著市場(chǎng)的突飛猛進(jìn),開(kāi)發(fā)商也在獲益。新交易者的首要任務(wù)是設(shè)置比特幣錢(qián)包。...
摘要:創(chuàng)建比特幣錢(qián)包需要一組優(yōu)秀的程序員。如何使用流行的庫(kù)構(gòu)建自己的比特幣錢(qián)包應(yīng)用程序創(chuàng)建比特幣錢(qián)包應(yīng)用程序的一種方法是依賴現(xiàn)有工具。具有以下功能它允許開(kāi)發(fā)人員使用密碼加密創(chuàng)建比特幣錢(qián)包應(yīng)用程序。 盡管目前加密貨幣市場(chǎng)相當(dāng)黯淡,但比特幣和其他山寨幣繼續(xù)受歡迎。每天都有新的交易者加入市場(chǎng),希望能夠在下一個(gè)價(jià)格高漲時(shí)獲利。 隨著市場(chǎng)的突飛猛進(jìn),開(kāi)發(fā)商也在獲益。新交易者的首要任務(wù)是設(shè)置比特幣錢(qián)包。...
摘要:本文解釋了比特幣交易的內(nèi)容,目的和結(jié)果。本文底部的信息圖提供了從錢(qián)包到區(qū)塊鏈的整個(gè)比特幣交易流程的全面說(shuō)明。在文本中使用的任何地方是比特幣交易的縮寫(xiě)。目的比特幣交易的目的是將一定數(shù)量的比特幣的所有權(quán)轉(zhuǎn)移到比特幣地址。 本文解釋了比特幣交易的內(nèi)容,目的和結(jié)果。下面的解釋適用于新手和中級(jí)比特幣用戶。 作為加密貨幣用戶,你需要熟悉交易雛形——為了你對(duì)這種不斷發(fā)展的創(chuàng)新有信心,以及作為理解新興...
閱讀 1499·2023-04-25 15:40
閱讀 2881·2021-08-11 11:15
閱讀 2284·2019-08-26 13:48
閱讀 2861·2019-08-26 12:18
閱讀 2461·2019-08-23 18:23
閱讀 2916·2019-08-23 17:01
閱讀 2990·2019-08-23 16:29
閱讀 1108·2019-08-23 15:15