BTC公鑰生成地址的過程詳解

BTC公鑰生成地址的過程詳解

首先簡單介紹一下,BTC助記詞以及種子和公私鑰之間的關係:BTC助記詞生成種子,種子生成私鑰,私鑰生成公鑰,公鑰生成地址。

本文主要的內容是介紹公鑰生成地址的這一過程:
以該16進制公鑰做測試:02c041205ba02149d3e03c05ff67a6c519aa5d2bef293d2e7fc3951931bc9ad712

  1. 將公鑰進行SHA256哈希;
  2. 將第1步結果進行RIPEMD160哈希;
  3. 將BTC地址版本號(00)加在第2步結果前面;
  4. 將第3步結果進行雙SHA256哈希;
  5. 取第4步結果的前4字節,並加在第3步結果後面;
  6. 取第5步結果進行Base58編碼;
  7. 得到BTC地址,1開頭的普通地址。

具體java實現如下:

		String publicKeyHex = "02c041205ba02149d3e03c05ff67a6c519aa5d2bef293d2e7fc3951931bc9ad712";
        byte[] sha256Bytes = Sha256Hash.hash(Hex.decode(publicKeyHex));
        //2.將第1步結果進行RIPEMD160哈希
        RIPEMD160Digest digest = new RIPEMD160Digest();
        digest.update(sha256Bytes, 0, sha256Bytes.length);
        byte[] ripemd160Bytes = new byte[digest.getDigestSize()];
        digest.doFinal(ripemd160Bytes, 0);
        //3.將BTC地址版本號(00)加在第2步結果簽名
        String result = "00" + Hex.toHexString(ripemd160Bytes);
        //4.將第3步結果進行雙SHA256哈希
        byte[] firstHash = Sha256Hash.hash(Hex.decode(result));
        byte[] doubleHash = Sha256Hash.hash(firstHash);
        //5.取第4步結果的前4字節,並加在第3步結果後面
        String checksum = Hex.toHexString(doubleHash).substring(0, 8);
        String checkStr = result + checksum;
        String address = Base58.encode(Hex.decode(checkStr));
        System.out.println(address);        //1Ks88rwj2viLLhGuTcwNFWH4jKuQwAZYAJ

關於LTC地址的推導過程其實和BTC是一模一樣的,只不過LTC的地址版本號是 30 而不是 00

所需maven依賴:

		<dependency>
            <groupId>org.bitcoinj</groupId>
            <artifactId>bitcoinj-core</artifactId>
            <version>0.15.2</version>
        </dependency>

當然,這是詳細過程,藉助 bitcoinj 這個jar包,完全可以直接生成1開頭的BTC地址以及bc1開頭的隔離見證地址,不過需要通過私鑰生成。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章