Skip to content

Commit 518681d

Browse files
committed
增加波场地址生成功能
1 parent 663bba9 commit 518681d

File tree

5 files changed

+110
-18
lines changed

5 files changed

+110
-18
lines changed

src/main/java/org/consenlabs/tokencore/wallet/Identity.java

+16-1
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,9 @@ public List<Wallet> deriveWallets(List<String> chainTypes, String password) {
175175
case ChainType.EOS:
176176
wallet = deriveEOSWallet(mnemonics, password);
177177
break;
178+
case ChainType.TRON:
179+
wallet = deriveTronWallet(mnemonics, password);
180+
break;
178181
default:
179182
throw new TokenException(String.format("Doesn't support deriving %s wallet", chainType));
180183
}
@@ -214,7 +217,9 @@ public List<Wallet> deriveWalletsByMnemonics(List<String> chainTypes, String pas
214217
case ChainType.EOS:
215218
wallet = deriveEOSWallet(mnemonics, password);
216219
break;
217-
220+
case ChainType.TRON:
221+
wallet = deriveTronWallet(mnemonics, password);
222+
break;
218223
default:
219224
throw new TokenException(String.format("Doesn't support deriving %s wallet", chainType));
220225
}
@@ -344,6 +349,16 @@ private Wallet deriveEthereumWallet(List<String> mnemonics, String password) {
344349
return WalletManager.createWallet(keystore);
345350
}
346351

352+
private Wallet deriveTronWallet(List<String> mnemonics, String password) {
353+
Metadata walletMetadata = new Metadata();
354+
walletMetadata.setChainType(ChainType.TRON);
355+
walletMetadata.setPasswordHint(this.getMetadata().getPasswordHint());
356+
walletMetadata.setSource(this.getMetadata().getSource());
357+
walletMetadata.setName("TRX");
358+
IMTKeystore keystore = V3MnemonicKeystore.create(walletMetadata, password, mnemonics, BIP44Util.TRON_PATH);
359+
return WalletManager.createWallet(keystore);
360+
}
361+
347362
private Wallet deriveEOSWallet(List<String> mnemonics, String password) {
348363
Metadata metadata = new Metadata();
349364
metadata.setChainType(ChainType.EOS);

src/main/java/org/consenlabs/tokencore/wallet/address/AddressCreatorManager.java

+30-16
Original file line numberDiff line numberDiff line change
@@ -7,26 +7,40 @@
77
import org.consenlabs.tokencore.wallet.model.Messages;
88
import org.consenlabs.tokencore.wallet.model.Metadata;
99
import org.consenlabs.tokencore.wallet.model.TokenException;
10-
import org.consenlabs.tokencore.wallet.network.LitecoinMainNetParams;
10+
import org.consenlabs.tokencore.wallet.network.*;
1111

1212
public class AddressCreatorManager {
1313

14-
public static AddressCreator getInstance(String type, boolean isMainnet, String segWit) {
15-
if (ChainType.ETHEREUM.equals(type)) {
16-
return new EthereumAddressCreator();
17-
}else if(ChainType.LITECOIN.equals(type)){
18-
NetworkParameters network= LitecoinMainNetParams.get();
19-
return new BitcoinAddressCreator(network);
20-
} else if (ChainType.BITCOIN.equals(type)) {
14+
public static AddressCreator getInstance(String type, boolean isMainnet, String segWit) {
15+
if (ChainType.ETHEREUM.equals(type)) {
16+
return new EthereumAddressCreator();
17+
} else if (ChainType.TRON.equals(type)) {
18+
return new TronAddressCreator();
19+
} else if (ChainType.LITECOIN.equals(type)) {
20+
NetworkParameters network = LitecoinMainNetParams.get();
21+
return new BitcoinAddressCreator(network);
22+
} else if (ChainType.DASH.equals(type)) {
23+
NetworkParameters network = DashMainNetParams.get();
24+
return new BitcoinAddressCreator(network);
25+
} else if (ChainType.DOGECOIN.equals(type)) {
26+
NetworkParameters network = DogecoinMainNetParams.get();
27+
return new BitcoinAddressCreator(network);
28+
} else if (ChainType.BITCOINSV.equals(type)) {
29+
NetworkParameters network = BitcoinSvMainNetParams.get();
30+
return new BitcoinAddressCreator(network);
31+
} else if (ChainType.BITCOINCASH.equals(type)) {
32+
NetworkParameters network = BitcoinCashMainNetParams.get();
33+
return new BitcoinAddressCreator(network);
34+
} else if (ChainType.BITCOIN.equals(type)) {
2135

22-
NetworkParameters network = isMainnet ? MainNetParams.get() : TestNet3Params.get();
23-
if (Metadata.P2WPKH.equals(segWit)) {
24-
return new SegWitBitcoinAddressCreator(network);
25-
}
26-
return new BitcoinAddressCreator(network);
27-
} else {
28-
throw new TokenException(Messages.WALLET_INVALID_TYPE);
36+
NetworkParameters network = isMainnet ? MainNetParams.get() : TestNet3Params.get();
37+
if (Metadata.P2WPKH.equals(segWit)) {
38+
return new SegWitBitcoinAddressCreator(network);
39+
}
40+
return new BitcoinAddressCreator(network);
41+
} else {
42+
throw new TokenException(Messages.WALLET_INVALID_TYPE);
43+
}
2944
}
30-
}
3145

3246
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package org.consenlabs.tokencore.wallet.address;
2+
3+
import org.bitcoinj.core.Base58;
4+
import org.bitcoinj.core.ECKey;
5+
import org.consenlabs.tokencore.foundation.crypto.Hash;
6+
import org.consenlabs.tokencore.foundation.utils.NumericUtil;
7+
8+
import java.math.BigInteger;
9+
import java.util.Arrays;
10+
11+
import static java.util.Arrays.copyOfRange;
12+
13+
/**
14+
* Created by pie on 2020/9/6 22: 28.
15+
*/
16+
public class TronAddressCreator implements AddressCreator {
17+
18+
private static final byte ADD_PRE_FIX_BYTE_MAINNET = (byte) 0x41;
19+
20+
private static final int PUBLIC_KEY_SIZE = 64;
21+
22+
private String encode58Check(byte[] input) {
23+
byte[] hash0 = Hash.sha256(input);
24+
byte[] hash1 = Hash.sha256(hash0);
25+
byte[] inputCheck = new byte[input.length + 4];
26+
System.arraycopy(input, 0, inputCheck, 0, input.length);
27+
System.arraycopy(hash1, 0, inputCheck, input.length, 4);
28+
return Base58.encode(inputCheck);
29+
}
30+
31+
public String fromPublicKey(BigInteger publicKey) {
32+
byte[] pubKeyBytes = NumericUtil.bigIntegerToBytesWithZeroPadded(publicKey, PUBLIC_KEY_SIZE);
33+
return publicKeyToAddress(pubKeyBytes);
34+
}
35+
36+
private String publicKeyToAddress(byte[] pubKeyBytes) {
37+
byte[] hashedBytes = Hash.keccak256(pubKeyBytes);
38+
byte[] address = copyOfRange(hashedBytes, 11, hashedBytes.length);
39+
address[0] = ADD_PRE_FIX_BYTE_MAINNET;
40+
return encode58Check(address);
41+
}
42+
43+
@Override
44+
public String fromPrivateKey(String prvKeyHex) {
45+
ECKey key = ECKey.fromPrivate(NumericUtil.hexToBytes(prvKeyHex), false);
46+
return fromECKey(key);
47+
}
48+
49+
@Override
50+
public String fromPrivateKey(byte[] prvKeyBytes) {
51+
ECKey key = ECKey.fromPrivate(prvKeyBytes, false);
52+
return fromECKey(key);
53+
}
54+
55+
private String fromECKey(ECKey key) {
56+
byte[] pubKeyBytes = key.getPubKey();
57+
return publicKeyToAddress(Arrays.copyOfRange(pubKeyBytes, 1, pubKeyBytes.length));
58+
}
59+
60+
}

src/main/java/org/consenlabs/tokencore/wallet/model/BIP44Util.java

+1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ public class BIP44Util {
2020
public final static String EOS_PATH = "m/44'/194'";
2121
public final static String EOS_SLIP48 = "m/48'/4'/0'/0'/0',m/48'/4'/1'/0'/0'";
2222
public final static String EOS_LEDGER = "m/44'/194'/0'/0/0";
23+
public final static String TRON_PATH ="m/44'/195'/0'/0/0";
2324

2425

2526
public static ImmutableList<ChildNumber> generatePath(String path) {

src/main/java/org/consenlabs/tokencore/wallet/model/ChainType.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ public class ChainType {
99
public final static String BITCOINCASH = "BITCOINCASH";
1010
public final static String BITCOINSV = "BITCOINSV";
1111
public final static String DOGECOIN = "DOGECOIN";
12+
public final static String TRON = "TRON";
1213

1314

1415
public static void validate(String type) {
@@ -19,7 +20,8 @@ public static void validate(String type) {
1920
!DASH.equals(type) &&
2021
!BITCOINSV.equals(type) &&
2122
!BITCOINCASH.equals(type) &&
22-
!DOGECOIN.equals(type)) {
23+
!DOGECOIN.equals(type) &&
24+
!TRON.equals(type)) {
2325
throw new TokenException(Messages.WALLET_INVALID_TYPE);
2426
}
2527
}

0 commit comments

Comments
 (0)